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?
String
und gibt einen regulären Ausdruck zurückString
, der mit der Eingabe übereinstimmt (dh es kümmert sich um das Entkommen für Sie).Pattern.quote
Antworten:
String.split
erwartet 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.quelle
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.
quelle
Some|Delimited|Text|With|An\|Embedded|Pipe|Char
in("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("(?<!\\\\)\\|");
Sie können dies einfach tun:
quelle