parsestring parse java parsing string

java - parsestring - string.parse c#



Java String split no devuelve los valores correctos (4)

Estoy intentando analizar un archivo txt que representa una gramática para usar en un analizador de descenso recursivo. El archivo txt se vería algo así:

SPRIME :: = Expr eof
Expr :: = Term Expr ''
Expr '':: = + Term Expr'' | - Término Expr ''| mi

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

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

Sin embargo, cuando llamo al segundo método de división, no se me devuelve una matriz de las cadenas separadas por "|" carácter, pero una matriz de cada carácter individual en el lado derecho, incluyendo "|". Por ejemplo, si estaba analizando la regla de Expr e imprimí la matriz productionRules, se vería así:

"+"
"Término"
"Expr ''"
""
"|"

Cuando lo que realmente quiero debería verse así:

  • Término Expr ''

¿Alguien tiene alguna idea de lo que estoy haciendo mal?


Dado que split toma una expresión regular como argumento, debe escapar de todos los símbolos de expresión regular no destinados.


Debe escapar al símbolo de la tubería ( | ) que es un operador de regex OR

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

o

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


El carácter de la tubería es el operador de expresiones regulares para "o". Lo que quieres es

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

lo que le dice que busque un personaje de pipa real.


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

Intenta 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 los literales de cadena.