Java String Split entfernte leere Werte

Lesezeit: 5 Minuten

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.

Java String Split entfernte leere Werte
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.

  • Beeindruckend. das hat wunderbar funktioniert. aber -1 wie ändert das alles?

    – RaceBase

    30. Januar 2013 um 10:47 Uhr

  • du kannst es sogar damit versuchen data.split("\\|", 8)

    – Subhrajyoti Majumder

    30. Januar 2013 um 10:48 Uhr

  • Nicht verwenden split("\\|", 8) weil dies auf die ersten acht Token beschränkt ist! Wenn Ihre Zeichenfolge variabel ist, sollten Sie verwenden split("\\|", -1) so dass es eine unbegrenzte Anzahl von Token erstellt und nicht Lege am Ende leere Tokens ab.

    – ADTC

    19. September 2013 um 4:59 Uhr

  • @Reddy -1 (oder jede negative Zahl, es spielt keine Rolle, was der absolute Wert ist) weist die Methode split an, die leeren Token am Ende zu behalten. Der Standardwert ist 0, was die Methode anweist, leere Token am Ende des Arrays zu verwerfen.

    – ADTC

    19. September 2013 um 5:01 Uhr

  • Anscheinend haben viele Leute erwartet, dass das Beibehalten der abschließenden leeren Zeichenfolgen die Standardfunktionalität für ist split(regex). Sie landeten hier und fanden heraus, dass es nicht so ist.

    – Attila Tanyi

    11. Juli 2017 um 14:25 Uhr

1646640427 776 Java String Split entfernte leere Werte
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.

1646640428 726 Java String Split entfernte leere Werte
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

964230cookie-checkJava String Split entfernte leere Werte

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy