386 Stimmen

Java String Split entfernt leere Werte

Ich versuche, den Wert mithilfe eines Trennzeichens 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, dass ich 8 Werte erhalte. [5,6,7,LEER,8,9,LEER,LEER] Ich erhalte jedoch nur 6 Werte.

Irgendeine Idee und wie man das beheben kann. Egal EMPTY Wert kommt an jedem Ort, sollte es in Array sein.

648voto

jlordo Punkte 36554

split(delimiter) entfernt standardmäßig nachstehende leere Zeichenfolgen aus dem Ergebnis-Array. Um diesen Mechanismus auszuschalten, müssen wir eine überladene Version von split(delimiter, limit) con limit auf einen negativen Wert gesetzt wie

String[] split = data.split("\\|", -1);

Etwas mehr Details:
split(regex) liefert intern das Ergebnis von split(regex, 0) und in Dokumentation dieser Methode finden Sie (Hervorhebung von mir)

En limit steuert, wie oft das Muster angewendet wird, und beeinflusst daher die Länge des resultierenden Arrays.

Wenn der Grenzwert n es 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 nach dem letzten übereinstimmenden Begrenzer.

Si n es nicht-positiv dann wird das Muster so oft wie möglich angewandt und das Array kann eine beliebige Länge haben.

Si n es Null dann wird das Muster so oft wie möglich angewandt, das Array kann beliebig lang sein, und Leere Zeichenketten am Ende werden verworfen .

Ausnahme :

Es ist erwähnenswert, dass das Entfernen der leeren Zeichenkette am Ende sinnvoll ist nur, wenn solche leeren Zeichenfolgen durch den Split-Mechanismus erzeugt wurden . Also für "".split(anything) da wir nicht aufteilen können "" weiter erhalten wir als Ergebnis [""] Array.
Es passiert, weil die Spaltung hier nicht stattgefunden hat, also "" obwohl es leer ist und einen Rückstand darstellt Original String, nicht leerer String, der erstellt durch Splitting-Verfahren.

40voto

ppeterka Punkte 20382

Aus der Dokumentation von String.split(String regex) :

Diese Methode funktioniert so, als würde man die Split-Methode mit zwei Argumenten mit dem angegebenen Ausdruck und einem Grenzwertargument 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 einem negativen Wert:

String[] split = data.split("\\|",-1);

Doc:

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 Begrenzer. Wenn n nicht positiv ist, wird das Muster so oft wie möglich angewendet, und das Array kann eine beliebige Länge haben. Ist n gleich Null, wird das Muster so oft wie möglich angewendet, das Array kann eine beliebige Länge haben und leere Zeichenketten am Ende werden verworfen.

Dabei werden keine leeren Elemente ausgelassen, auch nicht die am Ende.

7voto

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 tatsächliche Anforderung ist, dass die Länge 7 sein sollte, obwohl Daten fehlen. Denn es gibt Fälle, wie zum Beispiel, wenn ich in die Datenbank oder etwas anderes einfügen müssen. Wir können dies mit dem folgenden Ansatz erreichen.

    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 gemacht habe, ist, dass ich die "|"-Pipe am Ende entferne und dann den String aufteile. Wenn Sie "," als Trennzeichen haben, dann müssen Sie ",$" innerhalb replaceAll hinzufügen.

5voto

PermGenError Punkte 45737

Von String.split() API Doku :

Teilt diese Zeichenfolge um Übereinstimmungen o Diese Methode funktioniert so, als würde man die Zwei-Argumente-Methode split mit dem angegebenen Ausdruck und einem Grenzwertargument von Null. Nachfolgende leere Zeichenketten werden daher nicht in das resultierende Array aufgenommen.

Überlastet String.split(regex, int) für Ihren Fall besser geeignet ist.

3voto

Dmitriy Pichugin Punkte 331

Sie können mehrere Trennzeichen haben, einschließlich Leerzeichen, Kommas, Semikolons usw. Nehmen Sie diese in einer wiederholbaren Gruppe mit []+, wie:

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

Sie haben 4 Spielsteine - a, b, c, d

Führende Trennzeichen in der Quellzeichenkette müssen vor der Anwendung dieser Aufteilung entfernt werden.

als Antwort auf die gestellte Frage:

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

Leerzeichen hinzugefügt, nur für den Fall, dass Sie diese als Trennzeichen zusammen mit | haben werden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X