split(delimiter)par défaut, supprime les chaînes vides de fin du tableau de résultats. Pour désactiver ce mécanisme, nous devons utiliser une version surchargée de split(delimiter, limit)avec limitune valeur négative comme
String[] split = data.split("\\|",-1);
Un peu plus de détails: split(regex)retourne en interne le résultat de split(regex, 0)et dans la documentation de cette méthode que vous pouvez trouver (soulignement le mien)
Le limitparamètre contrôle le nombre de fois que le motif est appliqué et affecte donc la longueur du tableau résultant.
Si la limite nest supérieure à zéro, le modèle sera appliqué au plus n - 1 fois, la longueur du tableau ne sera pas supérieure à n et la dernière entrée du tableau contiendra toutes les entrées au-delà du dernier délimiteur correspondant.
Si elle nn'est pas positive, le motif sera appliqué autant de fois que possible et le tableau peut avoir n'importe quelle longueur.
Si nest égal à zéro, le modèle sera appliqué autant de fois que possible, le tableau peut avoir n'importe quelle longueur et les chaînes vides de fin seront supprimées .
Exception :
Il convient de mentionner que la suppression d'une chaîne vide de fin n'a de sens que si ces chaînes vides sont créées par un mécanisme de fractionnement . Donc, "".split(anything)puisque nous ne pouvons pas diviser ""plus loin, nous obtiendrons un [""]tableau de résultats .
Cela se produit parce que le fractionnement ne s'est pas produit ici, donc ""bien qu'il soit vide et que la fin représente la chaîne d' origine , pas une chaîne vide créée par le processus de fractionnement.
sensationnel. cela a fonctionné avec brio. mais -1 comment cela change tout?
Reddy
1
vous pouvez même essayer avecdata.split("\\|", 8)
Subhrajyoti Majumder
23
Ne l'utilisez pas split("\\|", 8)car cela limite les huit premiers jetons! Si votre chaîne est variable, vous devez l'utiliser split("\\|", -1)pour créer un nombre illimité de jetons et ne pas éliminer les jetons vides à la fin.
ADTC
2
@Reddy -1 ( ou tout nombre négatif en fait, peu importe la valeur absolue ) indique à la méthode de partage de conserver les jetons vides à la fin. La valeur par défaut est 0, ce qui indique à la méthode de supprimer les jetons vides à la fin du tableau.
ADTC
8
Apparemment, beaucoup de gens s'attendaient à ce que conserver les chaînes vides de fin soit la fonctionnalité par défaut de split(regex). Ils se sont retrouvés ici et ont découvert que ce n'était pas le cas.
Cette méthode fonctionne comme si en appelant la méthode de fractionnement à deux arguments avec l'expression donnée et un argument limite de zéro. Les chaînes vides de fin ne sont donc pas incluses dans le tableau résultant.
Si la limite n est supérieure à zéro, le modèle sera appliqué au plus n - 1 fois, la longueur du tableau ne sera pas supérieure à n et la dernière entrée du tableau contiendra toutes les entrées au-delà du dernier délimiteur correspondant. Si n n'est pas positif, le motif sera appliqué autant de fois que possible et le tableau peut avoir n'importe quelle longueur. Si n est zéro, le motif sera appliqué autant de fois que possible, le tableau peut avoir n'importe quelle longueur et les chaînes vides de fin seront rejetées.
Cela ne laissera pas de côté les éléments vides, y compris les éléments de fin.
Fractionne cette chaîne autour des correspondances de l'expression régulière donnée. Cette méthode fonctionne comme si en appelant la méthode de fractionnement à deux arguments avec l'expression donnée et un argument limite de zéro. Les chaînes vides de fin ne sont donc pas incluses dans le tableau résultant.
Cela explique le comportement mais ne répond pas à la question.
assylias
@assylias l'a ajouté à ma réponse maintenant :)
PermGenError
4
String[] split = data.split("\\|",-1);
Ce n'est pas l'exigence réelle en tout temps. L'inconvénient de ci-dessus est indiqué ci-dessous:
Scenerio1:When all data are present:String data ="5|6|7||8|9|10|";String[] split = data.split("\\|");String[] splt = data.split("\\|",-1);System.out.println(split.length);//output: 7System.out.println(splt.length);//output: 8
La véritable exigence est que la longueur devrait être de 7 bien qu'il manque des données. Parce qu'il y a des cas comme quand j'ai besoin d'insérer dans la base de données ou autre chose. Nous pouvons y parvenir en utilisant l'approche ci-dessous.
String data ="5|6|7||8|||";String[] split = data.split("\\|");String[] splt = data.replaceAll("\\|$","").split("\\|",-1);System.out.println(split.length);//output: 5System.out.println(splt.length);//output:7
Ce que j'ai fait ici, c'est que je supprime "|" tuyau à la fin, puis diviser la chaîne. Si vous avez "," comme séparateur, vous devez ajouter ", $" à l'intérieur de replaceAll.
vous pouvez avoir plusieurs séparateurs, y compris des espaces, des virgules, des points-virgules, etc. prenez ceux du groupe répétable avec [] +, comme:
data.split("\\|", 8)
split("\\|", 8)
car cela limite les huit premiers jetons! Si votre chaîne est variable, vous devez l'utilisersplit("\\|", -1)
pour créer un nombre illimité de jetons et ne pas éliminer les jetons vides à la fin.split(regex)
. Ils se sont retrouvés ici et ont découvert que ce n'était pas le cas.À partir de la documentation de
String.split(String regex)
:Vous devrez donc utiliser la version
String.split(String regex, int limit)
à deux arguments avec une valeur négative:Doc:
Cela ne laissera pas de côté les éléments vides, y compris les éléments de fin.
la source
Du String.split () API Doc :
Un String.split surchargé (regex, int) est plus approprié pour votre cas.
la source
String[] split = data.split("\\|",-1);
Ce n'est pas l'exigence réelle en tout temps. L'inconvénient de ci-dessus est indiqué ci-dessous:
Lorsque des données sont manquantes:
La véritable exigence est que la longueur devrait être de 7 bien qu'il manque des données. Parce qu'il y a des cas comme quand j'ai besoin d'insérer dans la base de données ou autre chose. Nous pouvons y parvenir en utilisant l'approche ci-dessous.
Ce que j'ai fait ici, c'est que je supprime "|" tuyau à la fin, puis diviser la chaîne. Si vous avez "," comme séparateur, vous devez ajouter ", $" à l'intérieur de replaceAll.
la source
vous pouvez avoir plusieurs séparateurs, y compris des espaces, des virgules, des points-virgules, etc. prenez ceux du groupe répétable avec [] +, comme:
vous aurez 4 jetons - a, b, c, d
les séparateurs de tête de la chaîne source doivent être supprimés avant d'appliquer ce fractionnement.
comme réponse à la question posée:
espaces blancs ajoutés juste au cas où si vous les avez comme séparateurs avec |
la source