Teilen eines Java-Strings durch das Pipe-Symbol mit split ("|")

195

In der offiziellen Java-Dokumentation heißt es:

Die Zeichenfolge "boo:and:foo"liefert beispielsweise mit diesen Ausdrücken das folgende Ergebnis: Regex-Ergebnis:

{ "boo", "and", "foo" }"

Und so muss es funktionieren. Wenn ich dies jedoch ausführe:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

es druckt:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

Welches ist weit von dem, was ich erwarten würde:

>A<
>B<
>C<
><
>D<

Warum passiert dies?

Bluehallu
quelle
2
Mögliches Duplikat von Wie man einen String in Java
teilt

Antworten:

423

Du brauchst

test.split("\\|");

splitverwendet reguläre Ausdrücke und in Regex | ist ein Metazeichen, das den OROperator darstellt. Sie müssen dieses Zeichen mit maskieren \(in String geschrieben, "\\"da \es auch ein Metazeichen in String-Literalen ist und ein anderes Zeichen benötigt \, um es zu maskieren).

Sie können auch verwenden

test.split(Pattern.quote("|"));

und lassen Sie Pattern.quotedie maskierte Version des regulären Ausdrucks erstellen |.

Jigar Joshi
quelle
17
Es ist, split()Methode nimmt Regex und |ist Sonderzeichen für reg ex
Jigar Joshi
1
Sie sind meine zweite Wahl als Moderator bei Stapelüberlauf. Alles Gute.
Däñish Shärmà
33

Verwenden Sie die richtige Flucht: string.split("\\|")

Oder verwenden Sie in Java 5+ den Helfer, Pattern.quote()der genau für diesen Zweck erstellt wurde:

string.split(Pattern.quote("|"))

Das funktioniert mit beliebigen Eingabezeichenfolgen. Sehr nützlich, wenn Sie Benutzereingaben zitieren / maskieren müssen.

Aaron Digulla
quelle
3
Nicht sicher, wann der Übergang gemacht wurde, aber in Java 8 würde man verwenden Pattern.quote().
RAnders00
4

Verwenden Sie diesen Code:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}
berliandi
quelle
Auf diese Lösung wird bereits durch akzeptierte Antwort hingewiesen. Keine Notwendigkeit, es zu wiederholen.
Pshemo
3

Sie können auch die Apache-Bibliothek verwenden und dies tun:

StringUtils.split(test, "|");
Simon
quelle
1

Sie können auch verwenden .split("[|]") .

(Ich habe dies stattdessen verwendet .split("\\|"), was bei mir nicht funktioniert hat.)

Homer
quelle
Beide Versionen sollten gut funktionieren. Wenn man es nicht tut, deutet dies darauf hin, dass das Problem woanders liegt.
Pshemo
@Pshemo Dies fügt jedoch einen interessanten Geschmack hinzu, dass einige reservierte Symbole nicht maskiert werden müssen, wenn sie in Klammern gesetzt werden.
Pax Vobiscum
0
test.split("\\|",999);

Die Angabe eines Grenzwerts oder eines Maximums ist für Beispiele wie "boo ||| a" oder "|| boo |" genau. oder "|||"

Aber test.split("\\|"); jedoch Zeichenfolgenarrays unterschiedlicher Länge für dieselben Beispiele zurück.

Referenz verwenden: Link

Ryan Augustine
quelle
-2

Die split () -Methode verwendet einen regulären Ausdruck als Argument

Stürmisch
quelle