2012-10-11 43 views
11

Quiero analizar cadenas JSON anidadas dividiéndolas recursivamente por {}. La expresión regular que surgió es "{([^}] *.?)}", Que tengo tested apropiadamente toma la cadena que quiero. Sin embargo, cuando trato de incluirlo en mi Java, aparece el siguiente error: "Secuencia de escape inválida (las válidas son \ b \ t \ n \ f \ r \" \ '\) "Regex de Java para hacer coincidir las llaves - "secuencia de escape no válida"

Este es mi código , y donde se produce el error:

String[] strArr = jsonText.split("\{([^}]*.?)\}"); 

¿Qué estoy haciendo mal

+1

no lo hacen escapa de las llaves ... – assylias

+1

Usa barras diagonales dobles para escapar de la barra diagonal inversa para Java en primer lugar. A continuación, no necesita escapar de las llaves. –

+2

BTW, hay buenas bibliotecas en la Web para analizar JSON para Java. –

Respuesta

10

1. Las llaves de curling no tienen un significado especial aquí para el lenguaje de expresiones regulares, por lo que no deberían escaparse, creo.

  1. Si quiere escapar de ellos, puede hacerlo. La barra invertida es un símbolo de escape para regexp, pero también debe escaparse para Java con una segunda barra invertida.

  2. ¿Por qué no escapas de la abrazadera de curle dentro de la construcción de agrupación?

  3. Hay buenas bibliotecas de análisis JSON https://stackoverflow.com/questions/338586/a-better-java-json-library

  4. está usando el cuantificador renuente, por lo que no va a funcionar con los apoyos anidadas, por ejemplo, para {"a", {"b", "c"}, "d"} que coincidirá {"a", {"b", "c"}

+0

+ 1hmm..'regex' para todo no es bueno! – Anirudha

+2

Solo un pequeño comentario: las llaves tienen realmente un significado especial para el motor regex (por ejemplo, A {1,2} para A y AA).Unescaped, pueden causar errores extraños, mientras 'Pattern.compile (...)'. – Oroboros102

+1

** las llaves tienen significado en expresiones regulares **, se pueden usar para decir ** cuántas veces puede ocurrir una repetición **. p.ej. [A-Z] {1,4} significa que las letras mayúsculas aparecerán entre 1 y 4 veces. –

1

es necesario para escapar de su barra invertida con una más barra invertida Puesto que, \{ no es una secuencia de escape válida: -?.

String[] strArr = jsonText.split("\\{([^\\}]*.?)\\}"); 

Puede consultar Pattern documentation para obtener más información sobre las secuencias de escape.

8

Lo desagradable de las expresiones regulares de Java es que java no reconoce una expresión regular como expresión regular.
Acepta solo \\, \', \" o \u[hexadecimal number] como secuencias de escape válidas. Por lo tanto, tendrá que escapar de las barras diagonales inversas porque obviamente \{ es una secuencia de escape no válida.
Versión corregida:

String[] strArr = jsonText.split("\\{([^}]*.?)\\}"); 
1

Doble las barras invertidas:

String[] strArr = jsonText.split("\\{([^}]*.?)\\}"); 
1

La expresión regular debe ser

"\\{([^}]*?)\\}" 

. no es necesario!

Cuestiones relacionadas