2012-07-24 4 views
8

Estoy tratando de mejorar en las expresiones regulares. Estoy teniendo dificultades para entender qué significa (?> expression). ¿Dónde puedo encontrar más información sobre los subexpresores sin retención? La descripción del enlace THIS dice:¿Cómo funciona la subexpresión sin retroceso? "(?> Exp)"

Subexpresión codiciosa, también conocida como subexpresión sin retroceso. Esto se combina solo una vez y luego no participa en retrocediendo.

este otro enlace: http://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.71).aspx tiene también una definición de subexpresión no dar marcha atrás pero sigo teniendo la comprensión de un tiempo difícil de lo que significa además que no puedo pensar en un ejemplo donde voy a utilizar (?>exp)

Respuesta

9

Como siempre, regular-expressions.info es un buen lugar para comenzar.

Usa un grupo atómico si quieres asegurarte de que lo que haya sido igualado siga siendo parte de la partida.

Por ejemplo, para que coincida con un número de "palabras" que pueden o no pueden ser separados por espacios, a continuación, seguido de dos puntos, un usuario intentó la expresión regular:

(?:[A-Za-z0-9_.&,-]+\s*)+: 

Cuando había un partido, todo estuvo bien. Pero cuando no lo hubo, su PC no respondería con una carga de CPU del 100% debido a un retroceso catastrófico porque el motor de expresiones regulares intentaría en vano buscar una combinación de palabras que permitiera que coincidan dos puntos. Lo cual fue por supuesto imposible.

Mediante el uso de un grupo atómico, esto podría haberse evitado:

(?>[A-Za-z0-9_.&,-]+\s*)+: 

Ahora lo que haya sido este permanece igualado - sin vuelta atrás y los tiempos por lo tanto, no rápido.

8

la expresión regular Tutorial tiene una página sobre ella aquí: http://www.regular-expressions.info/atomic.html

Básicamente lo que hace es dar marcha atrás descartes información, lo que significa que a(?>bc|b)c partidos abcc pero no abc.

La razón por la que no coincide con la segunda cadena es porque encuentra una coincidencia con bc, y descarta información de retroceso sobre la alternancia bc|b. Básicamente se olvida de la parte |b. Por lo tanto, no hay c después del bc, y la coincidencia falla.

El método más útil para usar grupos atómicos, como se les llama, es optimizar las expresiones regulares lentas. Puede encontrar más información en la página mencionada.

1

Lea en possessive quantifiers haga que el motor de retroceso recuerde solo el paso anterior que no coincidió con todos los pasos anteriores que coinciden.

Esto es útil cuando muchos pasos aceptables son probables y consumirán memoria si se almacena cada paso para una posible regresión de retroceso.

Los cuantificadores posesivos son una abreviatura de grupos atómicos.

Cuestiones relacionadas