Warum benötigt String.split ein Pipe-Trennzeichen, um maskiert zu werden?

140

Ich versuche, eine Datei zu analysieren, die jede Zeile mit durch Pipe getrennten Werten enthält. Es hat nicht richtig funktioniert, als ich den Pipe-Begrenzer in der Split-Methode nicht verlassen habe, aber es hat richtig funktioniert, nachdem ich wie unten beschrieben aus der Pipe entkommen bin.

private ArrayList<String> parseLine(String line) {
    ArrayList<String> list = new ArrayList<String>();
    String[] list_str = line.split("\\|"); // note the escape "\\" here
    System.out.println(list_str.length);
    System.out.println(line);
    for(String s:list_str) {
        list.add(s);
        System.out.print(s+ "|");
    }
    return list;
}

Kann jemand bitte erklären, warum das Pipe-Zeichen für die split()Methode maskiert werden muss?

Starthis
quelle
13
Die folgenden Antworten beantworteten das "Warum", aber nur zu Ihrer Information . Wenn Sie versuchen, eine wörtliche Zeichenfolge zu finden, sehen Sie sich möglicherweise auch Pattern.quote an . Es dauert ein Stringund gibt einen regulären Ausdruck zurück String, der mit der Eingabe übereinstimmt (dh es kümmert sich um das Entkommen für Sie).
Yshavit
+1 fürPattern.quote
redDevil

Antworten:

175

String.spliterwartet ein Argument für reguläre Ausdrücke. Ein Unescaped |wird als Regex analysiert, was "leere Zeichenfolge oder leere Zeichenfolge" bedeutet, was Sie nicht meinen.

Louis Wasserman
quelle
76

Weil die Syntax für diesen Parameter zum Teilen ein regulärer Ausdruck ist, wobei im '|' hat eine spezielle Bedeutung von OR und ein '\ |' bedeutet ein wörtliches '|' also die Zeichenfolge "\\ |" bedeutet den regulären Ausdruck '\ |' was bedeutet, dass genau das Zeichen '|' übereinstimmt.

Dlamblin
quelle
1
Danke für diese Erklärung. Ich vergesse fast immer, die doppelte Flucht zu benutzen. Jetzt, wo ich weiß, warum es so ist, wird es mir sicherlich von nun an helfen, mich zu erinnern.
Sufinawaz
Was passiert, wenn der Wert der String-Zeile einige Pipe-Zeichen enthält? Wie könnten Sie teilen, ohne das entkommene Rohr zu teilen? ?
AlexandreJ
@AlexandreJ Fragen Sie sich, wie Sie eine Zeile teilen, die so aussieht: Some|Delimited|Text|With|An\|Embedded|Pipe|Charin ("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")? Die Split - Funktion nicht unterstützt , wie dies zu entkommen, aber Sie könnten einen regulären Ausdruck fertigen können , die für diesen Fall arbeiten würde, wie mit einer Breite von Null negativen Behauptung Blick hinter Gruppe: (?<!\\)\|die wäreline.split("(?<!\\\\)\\|");
dlamblin
6

Sie können dies einfach tun:

String[] arrayString = yourString.split("\\|");
Ravinath
quelle
Sie müssen dem \ entkommen, um den regulären Ausdruck "yourString.split (" \\ | ")" zu verwenden. Dies ist die richtige Formel.
mautrok