Я пытаюсь разобрать файл, в котором каждая строка содержит значения, разделенные вертикальной чертой. Он не работал правильно, когда я не избегал разделителя трубы в методе разделения, но он работал правильно после того, как я сбежал из трубы, как показано ниже.
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;
}
Может кто-нибудь объяснить, почему для split()
метода нужно экранировать символ трубы ?
String
и возвращает регулярное выражение,String
которое будет соответствовать вводу (т. Е. Позаботится обо всех экранированиях за вас).Pattern.quote
Ответы:
String.split
ожидает аргумент регулярного выражения. Неэкранированное|
выражение анализируется как регулярное выражение, означающее «пустая строка или пустая строка», что вы не имеете в виду.источник
Поскольку синтаксис этого параметра для разделения - это регулярное выражение, где в '|' имеет особое значение OR, а '\ |' означает буквальное "|" поэтому строка "\\ |" означает регулярное выражение '\ |' что означает точное совпадение с символом '|'.
источник
Some|Delimited|Text|With|An\|Embedded|Pipe|Char
на("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")
? Функция разделения не поддерживает такое экранирование, но вы могли бы создать регулярное выражение, которое будет работать в этом случае, например, с отрицательным утверждением нулевой ширины, выглядящим позади группы:(?<!\\)\|
это будетline.split("(?<!\\\\)\\|");
Вы можете просто сделать это:
String[] arrayString = yourString.split("\\|");
источник