Estou tentando analisar um arquivo que tem cada linha com valores delimitados por canal. Ele não funcionou corretamente quando eu não escapei do delimitador de tubos no método de divisão, mas funcionou corretamente depois que eu escapei do tubo, como abaixo.
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;
}
Alguém pode explicar por que o caractere de pipe precisa ser escapado para o split()
método?
String
e retorna um regexString
que corresponderá à entrada (ou seja, ele cuida de todos os escapes para você).Pattern.quote
Respostas:
String.split
espera um argumento de expressão regular. Um sem escape|
é analisado como uma expressão regular que significa "sequência vazia ou sequência vazia", que não é o que você quer dizer.fonte
Como a sintaxe para esse parâmetro ser dividido é uma expressão regular, onde no '|' tem um significado especial de OR e um '\ |' significa um literal '|' então a string "\\ |" significa a expressão regular '\ |' o que significa corresponder exatamente ao caractere '|'.
fonte
Some|Delimited|Text|With|An\|Embedded|Pipe|Char
into("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")
? A função split não suporta escape assim, mas você pode criar uma expressão regular que funcione neste caso, como com uma asserção negativa de largura zero, por trás do grupo: o(?<!\\)\|
que serialine.split("(?<!\\\\)\\|");
Você pode simplesmente fazer isso:
fonte