2012-03-15 23 views
5

que tienen la siguiente expresión regular: (["'])(\\\1|[^\1])+\1¿Es posible la negación del grupo Java RegExp?

Obviamente no podría compilarse porque es [^\1] illeagal.

¿Es posible anular un grupo coincidente?

+1

¿Cuál es el texto que está intentando establecer la concordancia? Tu expresión regular es un poco confusa. – beerbajay

+0

La pregunta es, ¿es posible en otros sabores/idiomas? Podría imaginar que tal construcción no tiene sentido ya que un grupo de captura puede contener más de un personaje, por lo que '[^ \ 1]' sería una lista de estos personajes ... pero esta es solo mi opinión. También podría ser simplemente que el motor de expresiones regulares debe saber * de antemano * qué caracteres esperar. Funciona '[\ 1]'? –

+0

Solo encontré esto en ['regular-expression.info'] (http://www.regular-expressions.info/brackets.html): *" Las referencias hacia atrás tampoco se pueden usar dentro de una clase de caracteres. El '\ 1' en expresiones regulares como '(a) [\ 1b]' se interpretará como un escape octal en la mayoría de los sabores de expresiones regulares. Así que esta expresión regular coincidirá con una 'a' seguida de '\ x01' o una' b'. "* Si quiero tener más información sobre las expresiones regulares, sugiero [* Mastering Regular Expressions * de Jeffrey Friedl] (http://shop.oreilly.com/product/9780596528126.do). –

Respuesta

4

No se pueden usar referencias hacia atrás en una clase de caracteres positiva o negativa.

Pero se puede lograr lo que desea utilizando negativo lookahead assertions:

(["'])(?:\\.|(?!\1).)*\1 

Explicación:

(["']) # Match and remember a quote. 
(?:  # Either match... 
\\.  # an escaped character 
|   # or 
(?!\1) # (unless that character is identical to the quote character in \1) 
.  # any character 
)*  # any number of times. 
\1  # Match the corresponding quote. 
+0

Comentó en la otra pregunta que no funcionaría. ¿Qué tal '([" ']) (\\\ 1 |.) +? \ 1'? ¿No se supone que la alternancia se corresponde de izquierda a derecha? ¿O estoy perdiendo el problema aquí? Parece estar bien en JavaScript –

+0

@FelixKling: Tienes razón. Mover el paréntesis al lugar correcto resuelve el problema. Veamos si podemos recuperar la respuesta de Ademiban. –

+0

Votado para recuperar. Tu solución probablemente sea aún mejor ya que evita retroceder. –

Cuestiones relacionadas