2011-04-15 22 views
18

Estoy tratando de analizar un archivo txt que representa una gramática que se utilizará en un analizador de bajadas recursivo. El archivo de texto sería algo como esto:Java String split no devuelve los valores correctos

SPRIME :: = Expr EF
Expr :: = Plazo Expr '
Expr' :: = + Plazo Expr' | - Término Expr '| e

para aislar el lado izquierdo y dividir el lado derecho en reglas de producción independiente, tomo cada línea y llamo:

String[] firstSplit = line.split("::="); 
String LHS = firstSplit[0]; 
String productionRules = firstSplit[1].split("|"); 

Sin embargo, cuando llamo el segundo método de división, no estoy de regresar una matriz de cadenas separadas por "|" carácter, pero un conjunto de cada carácter individual en el lado derecho, incluido "|". Así, por ejemplo, si yo estaba analizando el Expr 'regla e imprimí la matriz productionRules, se vería así:

"+"
"Plazo"
"Expr'"
""
"| "

Cuando lo que realmente quiero debería tener este aspecto:

  • Plazo Expr'

Alguien tiene alguna idea de lo que estoy haciendo mal?

Respuesta

21

Dado que split toma una expresión regular como argumento, tiene que escapar de todos los símbolos de expresiones regulares no deseadas.

46

El parámetro String.split() es una expresión regular , y el carácter de la barra vertical es especial.

Trata de escapar con una barra invertida:

String productionRules = firstSplit[1].split("\\|"); 

NB: se requieren dos barras invertidas, ya que el propio carácter de barra invertida es especial dentro de la cadena.

+0

Muchas gracias, sabía que era algo que tenía que ver con las expresiones regulares, ¡funciona como un regalo ahora! –

+0

es tradicional por aquí enviar respuestas correctas y "aceptar" la que más te guste. – Alnitak

+0

Actualmente con 11 representantes, @Richard no puede votar aún. Pero aceptar una respuesta ciertamente sería cortés. –

11

Tiene que escapar el símbolo de la tubería (|) que es un regexOR operador.

String productionRules = firstSplit[1].split("\\|"); 

o

String productionRules = firstSplit[1].split(Pattern.quote("|")); 
7

El carácter de barra vertical es el operador de expresiones regulares para la "o". Lo que quiere es

String productionRules = firstSplit[1].split("\\|"); 

que le indica que busque un carácter de tubería real.

Cuestiones relacionadas