Regular Expressions
Lookahead y Lookbehind
Buscar..
Sintaxis
- Lookahead positivo:
(?=pattern)
- Lookahead negativo:
(?!pattern)
- Mirada positiva detrás de :
(?<=pattern)
- Mirada negativa detrás de :
(?<!pattern)
Observaciones
No es compatible con todos los motores de expresiones regulares.
Además, muchos motores de expresiones regulares limitan los patrones en el interior de las cuerdas de longitud fija. Por ejemplo, el patrón (?<=a+)b
debe coincidir con la b
en aaab
pero arroja un error en Python.
Los grupos de captura están permitidos y funcionan como se espera, incluidas las referencias inversas. Sin embargo, el lookahead / lookbehind no es un grupo de captura.
Lo esencial
Un lookahead positivo (?=123)
afirma que el texto es seguido por el patrón dado, sin incluir el patrón en la coincidencia. De manera similar, una mirada positiva detrás de (?<=123)
afirma que el texto está precedido por el patrón dado. Sustituyendo el =
con !
Niega la afirmación.
Entrada : 123456
-
123(?=456)
coincide con123
( lookahead positivo ) -
(?<=123)456
coincidencias456
( aspecto positivo detrás de ) -
123(?!456)
falla ( lookahead negativo ) -
(?<!123)456
falla ( aspecto negativo detrás de )
Entrada : 456
-
123(?=456)
falla -
(?<=123)456
falla -
123(?!456)
falla -
(?<!123)456
partidos456
Usando lookbehind para probar finales.
Se puede usar una mirada detrás del final de un patrón para asegurar que termine o no de cierta manera.
([az ]+|[AZ ]+)(?<! )
coincide con secuencias de solo letras en minúsculas o mayúsculas, excluyendo los espacios en blanco finales.
Simulando la apariencia de longitud variable detrás de \ K
Algunos sabores de expresiones regulares (Perl, PCRE, Oniguruma, Boost) solo son compatibles con el aspecto de longitud fija, pero ofrecen la función \K
, que se puede usar para simular el aspecto de longitud variable al inicio de un patrón. Al encontrar un \K
, el texto coincidente hasta este punto se descarta, y solo el texto que coincide con la parte del patrón que sigue a \K
se mantiene en el resultado final.
ab+\Kc
Es equivalente a:
(?<=ab+)c
En general, un patrón de la forma:
(subpattern A)\K(subpattern B)
Termina siendo similar a:
(?<=subpattern A)(subpattern B)
Excepto cuando el subpatrón B puede coincidir con el mismo texto que el subpatrón A, podría terminar con resultados sutilmente diferentes, porque el subpatrón A todavía consume el texto, a diferencia de lo que se ve por detrás.