Encontré estas cosas en mi cuerpo de expresiones regulares, pero no tengo idea de para qué puedo usarlas. ¿Alguien tiene ejemplos para que yo pueda tratar de entender cómo funcionan?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
regex
lookaround
Spidfire
fuente
fuente
Respuestas:
Ejemplos
Dada la cadena
foobarbarfoo
:También puedes combinarlos:
Definiciones
Mira hacia adelante positivo
(?=)
Encuentre la expresión A donde sigue la expresión B:
Mira hacia adelante negativo
(?!)
Encuentre la expresión A donde la expresión B no sigue:
Mira hacia atrás positivo
(?<=)
Encuentre la expresión A donde la expresión B precede:
Mira hacia atrás negativo
(?<!)
Encuentra la expresión A donde la expresión B no precede:
Grupos atómicos
(?>)
Un grupo atómico sale de un grupo y arroja patrones alternativos después del primer patrón coincidente dentro del grupo (el retroceso está desactivado).
(?>foo|foot)s
aplicado afoots
coincidirá con su primera alternativafoo
, luego fallará comos
no sigue inmediatamente y se detendrá cuando el retroceso esté deshabilitadoUn grupo no atómico permitirá retroceder; Si la coincidencia posterior falla, retrocederá y utilizará patrones alternativos hasta que se encuentre una coincidencia para toda la expresión o se agoten todas las posibilidades.
(foo|foot)s
aplicado a lafoots
voluntad:foo
, luego falla comos
no sigue inmediatamentefoots
y retrocede a su segunda alternativa;foot
, luego triunfe comos
sigue inmediatamentefoots
y pare.Algunos recursos
Probadores en línea
fuente
Lookarounds son aserciones de ancho cero. Verifican si hay una expresión regular (hacia la derecha o hacia la izquierda de la posición actual, basada en adelante o atrás), tiene éxito o falla cuando se encuentra una coincidencia (en función de si es positiva o negativa) y descarta la parte coincidente. No consumen ningún carácter: la coincidencia para la expresión regular que los sigue (si corresponde) comenzará en la misma posición del cursor.
Lea regular-expression.info para más detalles.
Sintaxis:
Coincidir solo si REGEX_1 coincide; después de hacer coincidir REGEX_1, la coincidencia se descarta y la búsqueda de REGEX_2 comienza en la misma posición.
ejemplo:
REGEX_1 es el
[a-z0-9]{4}$
que coincide con cuatro caracteres alfanuméricos seguidos por el final de la línea.REGEX_2 es el
[a-z]{1,2}[0-9]{2,3}
que coincide con una o dos letras seguidas de dos o tres dígitos.REGEX_1 se asegura de que la longitud de la cadena sea de hecho 4, pero no consume ningún carácter para que la búsqueda de REGEX_2 comience en la misma ubicación. Ahora REGEX_2 se asegura de que la cadena coincida con algunas otras reglas. Sin mirar hacia adelante, coincidiría con cadenas de longitud tres o cinco.
Sintaxis:
Coincidir solo si REGEX_1 no coincide; después de verificar REGEX_1, la búsqueda de REGEX_2 comienza en la misma posición.
ejemplo:
La parte de anticipación verifica
FWORD
la cadena y falla si la encuentra. Si no encuentraFWORD
, la búsqueda anticipada tiene éxito y la siguiente parte verifica que la longitud de la cadena esté entre 10 y 30 y que solo contenga caracteres de palabrasa-zA-Z0-9_
El mirar hacia atrás es similar al mirar hacia adelante: solo mira detrás de la posición actual del cursor. Algunos sabores de expresiones regulares como javascript no admiten aserciones de retrospectiva. Y la mayoría de los sabores que lo admiten (PHP, Python, etc.) requieren que la porción retrospectiva tenga una longitud fija.
fuente
(?=REGEX_1)REGEX_2
solo coincidiría siREGEX_2
viene despuésREGEX_1
?Grokking busca rápidamente.
¿Cómo distinguir lookahead y lookbehind? Toma 2 minutos de recorrido conmigo:
Suponer
Ahora le preguntamos a B: ¿Dónde estás?
B tiene dos soluciones para declararlo ubicación:
Uno, B tiene A adelante y tiene C bebind
Dos, B está adelante (hacia adelante) de C y detrás (mirar hacia atrás) A.
Como podemos ver, el atrás y el adelante son opuestos en las dos soluciones.
Regex es la solución dos.
fuente