Estoy tratando de analizar un archivo que tiene cada línea con valores delimitados por tuberías. No funcionó correctamente cuando no escapé del delimitador de tubería en el método de división, pero funcionó correctamente después de escapar de la tubería como se muestra a continuación.
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;
}
¿Alguien puede explicar por qué el carácter de la tubería debe escaparse para el split()
método?
String
y devuelve una expresión regularString
que coincidirá con la entrada (es decir, se encarga de todo el escape por usted).Pattern.quote
Respuestas:
String.split
espera un argumento de expresión regular. Un no escapado|
se analiza como una expresión regular que significa "cadena vacía o cadena vacía", que no es lo que quiere decir.fuente
Debido a que la sintaxis para que ese parámetro se divida es una expresión regular, donde en el '|' tiene un significado especial de OR, y un '\ |' significa un literal '|' entonces la cadena "\\ |" significa la expresión regular '\ |' lo que significa que coincide exactamente con el carácter '|'.
fuente
Some|Delimited|Text|With|An\|Embedded|Pipe|Char
en("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")
? La función de división no admite el escape de esta manera, pero es posible que pueda crear una expresión regular que funcione para este caso, como con una afirmación negativa de ancho cero mirar detrás del grupo:(?<!\\)\|
que seríaline.split("(?<!\\\\)\\|");
Simplemente puedes hacer esto:
fuente