regular online one look around regex lookaround

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 los foots :

    1. empareje su primera alternativa foo , luego falle ya que s no sigue inmediatamente en los foots , y retrocede a su segunda alternativa;
    2. haga coincidir su segundo foot alternativo, luego tenga éxito como s lo sigue inmediatamente en foots , y deténgase.
  • Un grupo atómico en la expresión (?>foo|foot)s aplicado a los foots coincidirá con su primera alternativa foo , luego fallará ya que s 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.