Guías1 caza jugable incluida

Lookahead y lookbehind en regex, explicados con tableros interactivos

Los lookarounds permiten a una regex comprobar lo que hay antes o después de un punto sin incluirlo en la coincidencia. Así funcionan los cuatro, dónde brillan y cuándo un patrón normal es más corto.

Logo de Regex Hunter

· 7 min de lectura

/q(?!u)/

atrapa

  • iraq
  • qatar
  • qi

deja libre

  • queen
  • quiet
  • quote

La mayor parte de una regex consume texto. cat se come tres caracteres, \d+ se come todos los dígitos que puede, y el motor avanza más allá de lo que ha encontrado.

Los lookarounds no. Se quedan en un punto de la cadena, miran hacia delante o hacia atrás y responden sí o no. Coinciden con cero caracteres. Esa sola idea te permite expresar cosas que un patrón normal no puede, como “una q que no va seguida de una u” o “un número que viene justo después de un signo de dólar, sin el signo de dólar”.

Todos los ejemplos de abajo son interactivos: edita el patrón y las líneas se actualizan, o pulsa Probar para abrirlo en la Zona de pruebas.

01Los cuatro lookarounds

Sintaxis Nombre Tiene éxito cuando…
(?=X) lookahead positivo X viene a continuación
(?!X) lookahead negativo X no viene a continuación
(?<=X) lookbehind positivo X viene justo antes
(?<!X) lookbehind negativo X no viene justo antes

El nombre indica la dirección: lookahead (“mirar hacia delante”) comprueba el texto que sigue a la posición actual, lookbehind (“mirar hacia atrás”) comprueba el texto anterior. = significa “tiene que estar”, ! significa “no puede estar”.

02Lookahead negativo: una q sin u

En inglés, la q casi siempre va seguida de u. Atrapar las excepciones es cosa de una línea con un lookahead negativo:

Coincidencias6/6 como se esperaba
/q(?!u)/

Debe coincidir3/3

  • iraq
  • qatar
  • qi

No debe3/3

  • queen
  • quiet
  • quote
Pruébalo en la Zona de pruebas
El (?!u) comprueba el carácter que sigue a la q, pero no lo incluye en la coincidencia. “iraq” pasa porque después de su q no hay nada.

Fíjate en iraq. Una alternativa tentadora es q[^u], “una q seguida de cualquier cosa menos u”. Pero [^u] tiene que coincidir con un carácter, y la q de iraq es la última letra. El lookahead solo pide que lo siguiente no sea una u, y el final de la cadena no es una u.

03Lookahead positivo: busca una parte, comprueba lo que sigue

Un lookahead positivo te permite exigir cierto contexto sin incluirlo en la coincidencia. Aquí queremos el número, pero solo cuando es una cantidad en dólares:

Coincidencias3/3 como se esperaba
/\d+(?= dollars)/

Debe coincidir1/1

  • it costs 40 dollars

No debe2/2

  • 40 euros
  • dollars 40
Pruébalo en la Zona de pruebas
En la primera línea solo coincide “40”. “ dollars” se comprueba, no se consume.

Esto importa siempre que reemplazas o extraes texto. Haz un buscar y reemplazar con \d+(?= dollars) y cambiarás el número, mientras la palabra “dollars” se queda exactamente como estaba.

04Lookaheads apilados: varias reglas a la vez

Como los lookaheads no mueven la posición, puedes poner varios en el mismo punto. Cada uno comprueba una regla distinta sobre toda la cadena. Es la comprobación clásica de contraseñas: al menos un dígito, al menos una mayúscula y ocho caracteres o más:

Coincidencias5/5 como se esperaba
/^(?=.*\d)(?=.*[A-Z]).{8,}$/

Debe coincidir2/2

  • Hunter2024
  • Regex1Hunter

No debe3/3

  • hunter2024
  • SHORT1
  • NoDigitsHere
Pruébalo en la Zona de pruebas
Dos lookaheads al principio recorren toda la cadena buscando un requisito cada uno. Después, .{8,} comprueba la longitud.

Léelo de izquierda a derecha: desde el principio, más adelante hay un dígito; desde ese mismo principio, más adelante hay una mayúscula; luego coincide con 8 caracteres o más hasta el final. El orden da igual, y por eso mismo los lookaheads ganan a escribir todas las combinaciones.

05Lookbehind: comprueba lo que vino antes

El lookbehind es la imagen en el espejo. (?<=\$)\d+ coincide con los dígitos que vienen justo después de un signo de dólar, sin el propio $:

Coincidencias3/3 como se esperaba
/(?<=\$)\d+/

Debe coincidir2/2

  • $42
  • price: $7

No debe1/1

  • 42 apples
Pruébalo en la Zona de pruebas
La coincidencia son solo los dígitos. El $ es obligatorio, pero queda fuera del resultado.

Y la forma negativa encuentra los números que no son precios:

Coincidencias4/4 como se esperaba
/(?<!\$)\b\d+\b/

Debe coincidir2/2

  • 42 apples
  • year 2026

No debe2/2

  • costs $42
  • $100
Pruébalo en la Zona de pruebas
(?<!\$) rechaza cualquier número con un $ justo delante. El \b a cada lado impide que coincida con el “00” de “$100”.

Esa última explicación esconde una trampa real. Sin los límites de palabra, (?<!\$)\d+ coincidiría sin problema con 00 en $100, porque esos 0 no están justo después del $. El lookbehind solo comprueba el punto donde empieza la coincidencia, así que a menudo necesitas \b o un ancla para fijar ese punto.

06Cuándo ganan los lookarounds en el golf, y cuándo no

En el golf de regex cada carácter cuenta, así que conviene saber cuándo vale la pena un lookaround.

Para dos letras en cualquier orden, una alternancia normal es más corta: a.*e|e.*a tiene 9 caracteres y (?=.*a).*e tiene 10. Pero el número de órdenes crece deprisa (2 para dos letras, 6 para tres, 24 para cuatro), mientras que cada lookahead extra cuesta siempre siete caracteres. Aquí tienes un tablero en el que todos los monstruos contienen una a, una e y una i, en cualquier orden:

Comparación64 % más corto

Tablerocertain · machine · relation · dialect · patience vs garden · pencil · plastic · money · violin

  1. todos los órdeneslo resuelve47
    /a.*e.*i|a.*i.*e|e.*a.*i|e.*i.*a|i.*a.*e|i.*e.*a/
  2. lookaheadslo resuelve17
    /(?=.*a)(?=.*e).*i/
Probar el más corto
Escribir los seis órdenes cuesta 47 caracteres. Dos lookaheads y un .*i final cuestan 17.

La versión con lookaheads funciona porque una búsqueda de regex prueba cada posición por turno. En la primera posición, los dos lookaheads recorren la palabra entera, así que da igual dónde estén la a y la e.

07Pruébalo

La misma idea, un tablero nuevo. Todos los monstruos tienen al menos un dígito y al menos una mayúscula, en cualquier orden:

Caza jugablepar 15

Atrapa las palabras que tienen un dígito y una mayúscula, en cualquier orden.

Objetivos · 0/5 atrapados

  • Hunt3robjetivo
  • R2d2objetivo
  • x9Yobjetivo
  • Agent47objetivo
  • 7Seasobjetivo

Inocentes · 0 errores

  • hunterinocente
  • r2d2inocente
  • AGENTinocente
  • 1999inocente
  • x9yinocente

Escribe una regex: el tablero se actualiza mientras escribes.

Pruébalo en la Zona de pruebas
¿Te gustó? Cada día llega una nueva.Jugar la caza de hoy

08Lo que debes saber antes de usarlos

  • Los lookarounds tienen ancho cero. (?=\d) por sí solo coincide con una cadena vacía delante de un dígito. Viene bien para insertar texto (como separadores de miles) y confunde cuando esperabas coincidir con el propio dígito.
  • El soporte varía. JavaScript (todos los navegadores modernos y Node), Python, Java, .NET y PCRE admiten lookahead y lookbehind. El módulo re integrado de Python solo permite lookbehind de ancho fijo, así que (?<=\$\d*) ahí es un error, mientras que JavaScript lo acepta. El paquete estándar regexp de Go no admite ningún lookaround.
  • Prefiere el patrón normal cuando se entiende. q[^u]|q$ también funciona, y a algunas personas les resulta más fácil de seguir. Usa un lookaround cuando deje clara la intención o te ahorre complejidad de verdad.

09Sigue practicando

  • La Guía de regex tiene una referencia rápida con más ejemplos interactivos.
  • Los lookarounds aparecen en los tableros del día más difíciles. Puede que la caza de hoy necesite uno.