8 Stimmen

String-Split liefert keine leeren Ergebnisse

Ich versuche, die

"value1:value2::value3".split(":");

Das Problem ist, dass ich die leeren Ergebnisse einbeziehen möchte.

Sie kehrt zurück: [value1, value2, value3]
So sollte es sein: [value1, value2, , value3]

Kennt jemand die Regexp, um dies zu beheben?

Ok, ich habe die Ursache des Problems gefunden. Ich lese gerade eine Textdatei und die enthält diese Zeile:

123:;~\&:ST02:M:test:M:4540145::type;12:51253:D:2.2:567766::AL:::::::2.2b

Wenn ich diese Zeile verarbeite, indem ich die Textdatei lese, kommt es zu dem oben erwähnten fehlerhaften Ergebnis, d. h. es werden keine leeren Ergebnisse in Fällen wie diesem angezeigt: :::::.

Aber wenn ich die obige Zeile in einem Testprogramm verwende, lässt sie sich nicht kompilieren und ich erhalte eine "ungültige Escape-Sequenz". Ich denke, das liegt an dem "\&".

Gibt es eine Lösung für dieses Problem, indem ein regulärer Ausdruck verwendet wird?

20voto

casablanca Punkte 68114

split leere Treffer in das Ergebnis aufnimmt, sehen Sie sich die Dokumente hier . Standardmäßig werden jedoch leere Zeichenfolgen (am Ende des Arrays) verworfen. Wenn Sie auch diese mit einbeziehen wollen, versuchen Sie split(":", -1) .

4voto

crazyscot Punkte 11509

Funktioniert bei mir.

class t {
    public static void main(String[] _) {
        String t1 = "value1:value2::value3";
        String[] t2 = t1.split(":");
        System.out.println("t2 has "+t2.length+" elements");
        for (String tt : t2) System.out.println("\""+tt+"\"");
    }
}

ergibt die Ausgabe

$ java t
t2 has 4 elements
"value1"
"value2"
""
"value3"

2voto

mezmo Punkte 2391

Ich denke, dass ein StringTokenizer könnte für Sie besser funktionieren, YMMV.

1voto

Bill K Punkte 61074

Ich verstehe ehrlich gesagt nicht, was an Split so toll sein soll. StringTokenizer funktioniert genauso gut für die meisten Dinge wie diese und sendet einfach die Token zurück (so können Sie sagen, dass es nichts dazwischen war :: ).

Ich wünschte nur, es würde ein wenig besser mit der erweiterten for-Schleife funktionieren, aber abgesehen davon kann es nicht schaden, es auszuprobieren.

Ich glaube, es gibt einen regexp-Trick, um Ihre übereinstimmenden Token zurückzubringen, aber ich habe 20 Jahre lang nicht regexp gelernt, und es war noch nie die beste Lösung für ein Problem, das ich in Angriff genommen habe (nicht, dass ich es wirklich wüsste, da ich es nie benutze, aber die Nicht-regexp-Lösungen sind im Allgemeinen zu leicht zu schlagen).

1voto

Matthew Flynn Punkte 2182

Verwenden Sie eine negative Grenze in Ihrer Split-Anweisung:

String str = "val1:val2::val3";
String[] st = str.split(":", -1);
for (int i = 0; i< st.length; i++)
    System.out.println(st[i]);

Ergebnisse:

val1
val2

val3

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