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?


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 |.


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.


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 + "<");
    }
}

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, "|");

1

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

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


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


-2

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.