2012-03-21 14 views
140

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 que escapé de la tubería como se muestra a continuación.¿Por qué String.split necesita el delimitador de tuberías para escaparse?

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; 
} 

Por favor alguien puede explicar por qué el carácter de canalización necesita ser escapado para el método split()?

+13

Las respuestas a continuación respondieron al "por qué", pero lo digo, si usted está tratando de coincidir con una cadena literal también se podría hacer en [Pattern.quote] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String)). Toma una 'Cadena' y devuelve una 'Cadena' regex que coincidirá con la entrada (es decir, se encarga de todo el escape para usted). – yshavit

+0

+1 para 'Pattern.quote' – redDevil

Respuesta

175

String.split espera un argumento de expresión regular. Un | sin enmascarar se analiza como una expresión regular que significa "cadena vacía o cadena vacía", que no es lo que quiere decir.

76

Porque la sintaxis para ese parámetro a split es una expresión regular, donde en el '|' tiene un significado especial de O, y un '\ |' significa un literal '|' entonces la cadena "\\ |" significa la expresión regular '\ |' lo que significa que coincide exactamente con el carácter '|'.

+1

Gracias por esta explicación. Casi siempre me olvido de usar el doble escape. Ahora que sé por qué es así, seguramente me ayudará a recordar a partir de ahora. – sufinawaz

+0

¿Qué sucede si el valor de la línea String tiene algunos caracteres Pipe? ¿Cómo podría dividirse sin dividir tubería escapada? | ? – AlexandreJ

+0

@AlexandreJ ¿Estás preguntando cómo dividir una línea que se parece a: 'Algunos | Delimitados | Texto | Con | Un \ | Integrado | Pipe | Char' en' ("Algunos", "Delimitado", "Texto", "Con "," An \ | Embedded "," Pipe "," Char ")' La función de división no admite el escapado de esta manera, pero es posible que pueda crear una expresión regular que funcione para este caso, como con una aseveración negativa de ancho cero detrás del grupo: '(? dlamblin

6

Usted puede simplemente hacer esto:

String[] arrayString = yourString.split("\\|"); 
+0

tienes que escapar del \ para usar tu eres regex" yourString.split ("\\ |") "esa es la fórmula correcta. – mautrok

Cuestiones relacionadas