Ich versuche, den Wert mit einem Trennzeichen aufzuteilen. Aber ich finde die überraschenden Ergebnisse
String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);
Ich erwarte 8 Werte zu bekommen. [5,6,7,EMPTY,8,9,EMPTY,EMPTY]
Aber ich bekomme nur 6 Werte.
Irgendeine Idee und wie man es repariert. Unabhängig davon, wo ein EMPTY-Wert ankommt, sollte er sich im Array befinden.

jlordo
split(delimiter)
standardmäßig entfernt nachgestellte leere Zeichenfolgen aus dem Ergebnisarray. Um diesen Mechanismus auszuschalten, müssen wir die überladene Version von verwenden split(delimiter, limit)
mit limit
auf negativen Wert setzen wie
String[] split = data.split("\\|", -1);
Etwas mehr Details:
split(regex)
gibt intern das Ergebnis von zurück split(regex, 0)
und in Dokumentation dieser Methode finden Sie (Hervorhebung von mir)
Die limit
Der Parameter steuert, wie oft das Muster angewendet wird, und wirkt sich daher auf die Länge des resultierenden Arrays aus.
Wenn die Grenze n
ist größer als Null dann wird das Muster höchstens n – 1 Mal angewendet, die Länge des Arrays ist nicht größer als n, und der letzte Eintrag des Arrays enthält alle Eingaben jenseits des letzten übereinstimmenden Trennzeichens.
Wenn n
ist nicht positiv dann wird das Muster so oft wie möglich angewendet und das Array kann beliebig lang sein.
Wenn n
ist Null dann wird das Muster so oft wie möglich angewendet, das Array kann beliebig lang sein, und nachfolgende leere Zeichenfolgen werden verworfen.
Ausnahme:
Es ist erwähnenswert, dass es sinnvoll ist, nachgestellte leere Zeichenfolgen zu entfernen nur wenn solche leeren Strings durch den Split-Mechanismus erzeugt wurden. So für "".split(anything)
da wir uns nicht trennen können ""
weiter werden wir als Ergebnis kommen [""]
Reihe.
Es passiert, weil Split hier nicht passiert ist, also ""
obwohl es leer ist und nachgestellt wird Original Zeichenfolge, keine leere Zeichenfolge, die war erstellt durch Spaltungsverfahren.

Peterka
Aus der Dokumentation von String.split(String regex)
:
Diese Methode funktioniert so, als würde sie die Split-Methode mit zwei Argumenten mit dem angegebenen Ausdruck und einem Limit-Argument von Null aufrufen. Nachfolgende leere Zeichenfolgen werden daher nicht in das resultierende Array aufgenommen.
Sie müssen also die Version mit zwei Argumenten verwenden String.split(String regex, int limit)
mit negativem Wert:
String[] split = data.split("\\|",-1);
Dok.:
Wenn der Grenzwert n größer als Null ist, wird das Muster höchstens n – 1 Mal angewendet, die Länge des Arrays ist nicht größer als n, und der letzte Eintrag des Arrays enthält alle Eingaben nach dem letzten übereinstimmenden Trennzeichen. Wenn n nicht positiv ist, wird das Muster so oft wie möglich angewendet und das Array kann eine beliebige Länge haben. Wenn n Null ist, wird das Muster so oft wie möglich angewendet, das Array kann beliebig lang sein, und abschließende leere Zeichenfolgen werden verworfen.
Dadurch werden keine leeren Elemente ausgelassen, einschließlich der nachgestellten.
String[] split = data.split("\\|",-1);
Dies ist nicht immer die eigentliche Anforderung. Der Nachteil von oben ist unten gezeigt:
Scenerio 1:
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: 7
System.out.println(splt.length); //output: 8
Wenn Daten fehlen:
Scenerio 2: Data Missing
String data = "5|6|7||8|||";
String[] split = data.split("\\|");
String[] splt = data.split("\\|",-1);
System.out.println(split.length); //output: 5
System.out.println(splt.length); //output: 8
Die eigentliche Anforderung ist, dass die Länge 7 sein sollte, obwohl Daten fehlen. Weil es Fälle gibt, in denen ich in die Datenbank oder etwas anderes einfügen muss. Wir können dies erreichen, indem wir den folgenden Ansatz verwenden.
String data = "5|6|7||8|||";
String[] split = data.split("\\|");
String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
System.out.println(split.length); //output: 5
System.out.println(splt.length); //output:7
Was ich hier getan habe, ist, ich entferne “|” Rohr am Ende und dann den String teilen. Wenn Sie “,” als Trennzeichen haben, müssen Sie “, $” innerhalb von replaceAll hinzufügen.
Von String.split() API-Dok:
Teilt diese Zeichenfolge um Übereinstimmungen des angegebenen regulären Ausdrucks herum. Diese Methode funktioniert so, als würde sie die Split-Methode mit zwei Argumenten mit dem angegebenen Ausdruck und einem Limit-Argument von Null aufrufen. Nachfolgende leere Zeichenfolgen werden daher nicht in das resultierende Array aufgenommen.
Überladen String.split (regex, int) ist für deinen Fall besser geeignet.

Dmitrij Picchugin
Sie können mehrere Trennzeichen haben, einschließlich Leerzeichen, Kommas, Semikolons usw. Nehmen Sie diese in wiederholbarer Gruppe mit []+, wie:
String[] tokens = "a , b, ,c; ;d, ".split( "[,; \t\n\r]+" );
Sie haben 4 Token – a, b, c, d
Führende Trennzeichen in der Quellzeichenfolge müssen entfernt werden, bevor diese Teilung angewendet wird.
als Antwort auf die gestellte Frage:
String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");
Leerzeichen wurden nur für den Fall hinzugefügt, wenn Sie diese als Trennzeichen zusammen mit | haben
9642300cookie-checkJava String Split entfernte leere Werteyes