one - regex online
Regex lookahead, lookebind y grupos atómicos (3)
Encontré estas cosas en mi cuerpo de expresiones regulares pero no tengo ni idea de para qué puedo usarlas. ¿Alguien tiene ejemplos para que pueda tratar de entender cómo funcionan?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
Ejemplos
Dada la cadena de foobarbarfoo
:
bar(?=bar) finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar finds the 2nd bar ("bar" which does not have "foo" before it)
También puedes combinarlos:
(?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it)
Definiciones
Mira hacia adelante positivo (?=)
Encuentra la expresión A donde sigue la expresión B:
A(?=B)
Mira hacia adelante negativo (?!)
Encuentre la expresión A donde la expresión B no sigue:
A(?!B)
Mira detrás de positivo (?<=)
Encuentra la expresión A donde la expresión B precede:
(?<=B)A
Mira detrás de negativo (?<!)
Encuentre la expresión A donde la expresión B no precede:
(?<!B)A
Grupos atómicos (?>)
Un grupo atómico es un grupo no capturador que sale del grupo y desecha todas las alternativas después de la primera coincidencia del patrón dentro del grupo, por lo que se desactiva el retroceso.
Un grupo no atómico permitirá retroceder, seguirá encontrando la primera coincidencia, luego, si la coincidencia anticipada falla, retrocederá y buscará la próxima coincidencia, hasta que se encuentre una coincidencia para toda la expresión o se agoten todas las posibilidades.
Un grupo no atómico en la expresión
(foo|foot)s
aplicado a losfoots
:- empareje su primera alternativa
foo
, luego falle ya ques
no sigue inmediatamente en losfoots
, y retrocede a su segunda alternativa; - haga coincidir su segundo
foot
alternativo, luego tenga éxito comos
lo sigue inmediatamente enfoots
, y deténgase.
- empareje su primera alternativa
Un grupo atómico en la expresión
(?>foo|foot)s
aplicado a losfoots
coincidirá con su primera alternativafoo
, luego fallará ya ques
no seguirá inmediatamente, y se detendrá cuando se desactive el seguimiento.
Algunos recursos
Grokking mirar rápidamente alrededor.
¿Cómo distinguir lookahead y lookbind? Toma 2 minutos de recorrido conmigo:
(?=) - positive lookahead
(?<=) - positive lookbehind
Suponer
A B C #in a line
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á delante (lookahead) de C y detrás (lookhehind) A.
Como podemos ver, el reverso y el delantero son opuestos en las dos soluciones.
Regex es la solución dos.
Miradas son aserciones de ancho cero. Verifican si hay expresiones regulares (hacia la derecha o hacia la izquierda de la posición actual, basadas en adelante o atrás), tienen éxito o fallan cuando se encuentra una coincidencia (en función de si es positiva o negativa) y descartan la parte coincidente. No consumen ningún carácter; la coincidencia para las expresiones regulares que los siguen (si existen), comenzará en la misma posición del cursor.
Lea regular-expressions.info/lookaround.html para más detalles.
- Lookahead positivo:
Sintaxis:
(?=REGEX_1)REGEX_2
Coincide solo si coincide REGEX_1; después de coincidir con REGEX_1, la coincidencia se descarta y la búsqueda de REGEX_2 comienza en la misma posición.
ejemplo:
(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}
REGEX_1 es [a-z0-9]{4}$
que coincide con cuatro caracteres alfanuméricos seguidos por el final de la línea.
REGEX_2 es [az]{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 4, pero no consume ningún carácter, por lo que la búsqueda de REGEX_2 comienza 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.
- Lookahead negativo
Sintaxis:
(?!REGEX_1)REGEX_2
Coincidir solo si REGEX_1 no coincide; después de marcar REGEX_1, la búsqueda de REGEX_2 comienza en la misma posición.
ejemplo:
(?!.*/bFWORD/b)/w{10,30}$
La parte que mira hacia adelante verifica el FWORD
en la cadena y falla si lo encuentra. Si no encuentra FWORD
, la búsqueda anticipada es exitosa y la siguiente parte verifica que la longitud de la cadena está entre 10 y 30 y que solo contiene caracteres de palabra a-zA-Z0-9_
Look-behind es similar a look-ahead: solo mira detrás de la posición actual del cursor. Algunos tipos de regex como javascript no admiten aserciones de búsqueda. Y la mayoría de los sabores que lo soportan (PHP, Python, etc.) requieren que la parte de look-behind tenga una longitud fija.
- Los grupos atómicos básicamente descartan / olvidan los tokens subsiguientes en el grupo una vez que un token coincide. Revisa esta página para ver ejemplos de grupos atómicos.