Regex lookahead, lookbehind y grupos atómicos

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 entender cómo funcionan?

(?!) - negative lookahead (?=) - positive lookahead (?<=) - positive lookbehind (?) - atomic group 

Ejemplos

Dada la cadena 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) (? 

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 (?=)

Encuentre 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) 

Mire detrás de positivo (?< =)

Encuentre 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 que no captura y que abandona el grupo y descarta todas las alternativas después del primer partido del patrón dentro del grupo, por lo que se deshabilita el retroceso.

Un grupo no atómico permitirá retroceder, aún encontrará la primera coincidencia, luego, si falla la coincidencia, retrocederá y buscará la siguiente 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 foots :

    1. emparejar su primera alternativa foo , luego fallar ya que s no sigue inmediatamente a foots , y retroceder a su segunda alternativa;
    2. empareje su 2do foot alternativo, luego tenga éxito ya que s sigue inmediatamente en foots , y pare.
  • Un grupo atómico en la expresión (?>foo|foot)s aplicado a foots coincidirá con su primera alternativa foo , luego fallará como s no sigue inmediatamente, y se detendrá ya que retroceder está deshabilitado.

Algunos recursos

Las miradas son aserciones de ancho cero. Comprueban si hay una expresión regular (hacia la derecha o hacia la izquierda de la posición actual, según avance o retroceso), 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 existe) comenzará en la misma posición del cursor.

Lea regular-expression.info para más detalles.

  • Posicionamiento positivo:

Sintaxis:

 (?=REGEX_1)REGEX_2 

Igualar 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:

 (?=[a-z0-9]{4}$)[az]{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 por dos o tres dígitos.

REGEX_1 se asegura de que la longitud de la cadena sea 4, pero no consum 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 otras reglas. Sin mirar hacia adelante coincidiría con cadenas de longitud tres o cinco.

  • Lookahead negativo

Sintaxis:

 (?!REGEX_1)REGEX_2 

Coincidencia 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:

 (?!.*\bFWORD\b)\w{10,30}$ 

La parte de anticipación busca el FWORD en la cadena y falla si lo encuentra. Si no encuentra FWORD , la búsqueda anticipada tiene éxito y la siguiente parte verifica que la longitud de la cadena esté entre 10 y 30 y que contenga solo caracteres de palabra a-zA-Z0-9_

Look-behind es similar a look-ahead: simplemente mira detrás de la posición actual del cursor. Algunos sabores de expresiones regulares, como javascript, no son compatibles con las afirmaciones de mirar atrás. Y la mayoría de los sabores que lo soportan (PHP, Python, etc.) requieren que la parte posterior tenga una longitud fija.

  • Los grupos atómicos básicamente descartan / olvidan los tokens subsiguientes en el grupo una vez que coincide un token. Consulte esta página para ver ejemplos de grupos atómicos

Grokking mira hacia atrás rápidamente.
¿Cómo distinguir lookahead y lookbehind? Haga una visita de 2 minutos conmigo:

 (?=) - positive lookahead (?< =) - positive lookbehind 

Suponer

  ABC #in a line 

Ahora, le preguntamos a B, ¿dónde estás?
B tiene dos soluciones para declarar su ubicación:

Uno, B tiene A por delante y tiene C bebind
Dos, B está delante (mirando adelante) de C y detrás (detrás) A.

Como podemos ver, el detrás y el adelante son opuestos en las dos soluciones.
Regex es la solución Dos.