2011-11-10 7 views
6

¿Cómo puedo resolver este problema de expresiones regulares de Java?Regex: ¿Cómo capturar esto? (un grupo anidado dentro de un grupo repetido)

de entrada:

some heading text... ["fds afsa","fwr23423","42df f","1a_4([email protected]#","3240acg!g"] some trailing text....

Problema: Me gustaría capturar todo lo que entre las comillas dobles. (Ejemplo: fds afsa, fwr23423, etc.)

I han intentado el siguiente patrón:

\[(?:"([^"]+)",?)+\]

Pero cuando se realiza una Matcher.find(), que se traducirá en un StackOverflowError, al utilizar una entrada más grande (pero funciona para una entrada pequeña, esto es un error en Java). E incluso si funcionó, entonces matcher.group (1) solo dará "3240acg! G".

¿Cómo puedo resolver este problema? (¿O es necesario el uso de varios patrones, donde el primer patrón elimina los corchetes?)

Respuesta

1

Obtenga una cadena entre [ ] y luego divida por comas. Es mucho mas facil

1

tres sugerencias:

Si las cadenas sólo pueden ocurrir entre paréntesis, a continuación, no es necesario comprobar por ellos en absoluto y sólo tiene que utilizar "[^"]*" como su expresión regular y encontrar todos los partidos (suponiendo que no se escaparon cotizaciones).

Si eso no funciona porque las cadenas también pueden ocurrir en otros lugares, donde no desea capturarlos, hágalo en dos pasos.

  1. Coincidir \[[^\]]*\].
  2. Encuentra todas las ocurrencias de "[^"]*" en el resultado de la primera coincidencia. O incluso use un analizador JSON para leer esa cadena.

tercera posibilidad, el engaño un poco:

Buscar "[^"\[\]]*"(?=[^\[\]]*\]). Eso coincidirá con una cadena solo si el siguiente corchete que sigue es un corchete de cierre. Limitación: No se permiten corchetes dentro de las cuerdas. Considero que esto es feo, sobre todo si nos fijamos en cómo se vería en Java:

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

¿Cree que cualquiera que mira a esto en unos pocos meses puede decir lo que está haciendo?

+0

Entonces se requieren múltiples patrones/coincidencias. Encontré algo similar aquí: http://answers.oreilly.com/topic/222-how-to-find-a-match-within-another-match-in-a-regular-expression/ – Devabc

+0

Bien, OK, hay es otra forma, pero no creo que sea buena. Lo he agregado a mi respuesta. –

Cuestiones relacionadas