Contenido del curso
Construcción de patrones para parsing avanzado
Regex robustas para entornos de producción
- 8

Cuantificadores codiciosos vs perezosos en regex
08:07 min - 9

Anclas y bordes de palabra: buscar vs validar
08:47 min - 10

Alternancia y paréntesis: domina grupos en regex
07:43 min - 11

Grupos nombrados en regex: adiós a los números
07:15 min - 12

Lookahead y lookbehind: cómo validar sin consumir texto
Viendo ahora - 13

Property escapes y flags para regex Unicode
07:19 min - 14

ReDoS: cómo una regex puede tumbar tu servidor
06:42 min
Lookahead y lookbehind: cómo validar sin consumir texto
Resumen
Las aserciones de mirada o lookaround son de lo más potente que ofrecen las expresiones regulares porque emparejan según lo que viene antes o después de un texto, sin consumir esos caracteres. Si trabajas con validaciones o extracción de datos, dominar el lookahead y el lookbehind te permite escribir patrones mucho más precisos.
¿Qué son las aserciones de ancho cero en las expresiones regulares?
Al igual que las anclas de inicio con el circunflejo ^ y de fin con el símbolo de dólar $, los lookaround son aserciones de ancho cero. Esto significa que no seleccionan texto para el resultado final, solo validan condiciones [00:38].
La gran diferencia es que estas comprueban si lo que viene adelante o lo que quedó atrás del texto cumple con un patrón completo. Piensa en un inspector que mira alrededor sin tocar nada.
¿Qué significa que un lookaround no consuma caracteres? Que el cursor del motor no avanza sobre el texto usado como condición. Ese texto sirve como detonador, pero queda fuera del match final.
¿Cómo funciona el lookahead positivo y negativo?
El lookahead mira hacia adelante. Su estructura es X(?=Y), que significa: empareja la X siempre y cuando lo que venga inmediatamente a su derecha sea Y, pero no consumas la Y [01:10].
Un ejemplo claro busca dígitos solo si están seguidos de un símbolo de euro. Ese símbolo funciona como condición y queda por fuera del match.
- Si procesas
100 €o50 €, el motor extrae limpiamente100y50[01:40]. - El cursor nunca avanza sobre el símbolo euro, se queda antes de él [02:47].
El lookahead negativo hace lo contrario. Busca la palabra Java siempre y cuando no tenga Script pegado a su derecha, así diferencias Java de JavaScript [01:58].
¿Cómo construir un validador de contraseñas con lookahead?
Aquí viene lo interesante: puedes encadenar varios lookahead para validar una contraseña recorriendo el patrón de izquierda a derecha [03:03].
- El ancla de inicio obliga al motor a pararse al principio de la cadena.
- Un primer lookahead positivo con
.*se salta cualquier cantidad de caracteres y asegura que haya al menos una letra mayúscula, luego vuelve al inicio. - Un segundo lookahead verifica que exista un dígito numérico.
- El último bloque consume el texto y exige mínimo ocho caracteres hasta el ancla del final [03:53].
Con esto, password1 genera match, pero pass1 o password1 con p minúscula fallan porque no cumplen todas las condiciones [04:07]. Si agregas otro lookahead que exija un carácter especial (cualquier cosa menos letra o número), entonces password1 deja de funcionar hasta que sumas un símbolo de admiración [04:30].
¿Cuándo debo usar el lookbehind en vez del lookahead?
Ahora invertimos la dirección del inspector. El lookbehind revisa el pasado del texto, es decir, lo que quedó a la izquierda de donde estamos ubicados [04:55].
Su estructura es (?<=Y)X, que significa: empareja la X siempre y cuando el texto que la precede haya sido una Y.
- Un lookbehind positivo extrae valores numéricos omitiendo símbolos financieros. Sobre
amount= $1250el motor devuelve solo1250[05:24]. - Un lookbehind negativo busca números que no tengan un guion o signo menos a su izquierda. En la lista
25, -10, 100ignora al-10y trae solo el25y el100[05:48].
¿Cuál es la diferencia entre lookahead y lookbehind? El lookahead mira hacia adelante (a la derecha del texto) y el lookbehind mira hacia atrás (a la izquierda). Ambos validan sin consumir caracteres.
¿Qué limitaciones tienen los lookaround según el motor?
Algo importante: muchos motores antiguos exigen que lo que esté dentro del lookbehind tenga una longitud fija, así que no puedes usar cuantificadores como + o * adentro [06:20]. Hoy PCRE2 o JavaScript moderno lo soportan, pero conviene mantenerlos fijos por portabilidad.
Además, los lookaround requieren que el motor pueda avanzar y retroceder, algo conocido como backtracking. Por eso motores de alta velocidad lineal no los soportan por defecto [06:47]:
- RE2 de Go.
- El motor nativo de Rust.
- HyperScan de Intel.
En esos lenguajes, o cuando la sintaxis se vuelva muy difícil, es mucho más limpio y portable usar un grupo de captura tradicional [07:03].
¿Cómo extraer montos de un archivo de logs con lookbehind?
Para cerrar, apliquemos esto a un caso real: un archivo de logs con líneas de errores de transferencias bancarias del que necesitas la lista pura de números para sumarlos, sin arrastrar el signo de dólar [07:16].
La solución es un lookbehind positivo dividido en tres partes:
- El lookbehind le dice al motor que mire inmediatamente a la izquierda y confirme si hay un signo de dólar literal.
- Cuando da el visto bueno, consume uno o más dígitos, atrapando por ejemplo el
1250[07:57]. - Un último bloque opcional captura el punto y los centavos, con un signo de interrogación al final porque no todos los montos tienen decimales [08:12].
Gracias a ese ? final, el patrón acepta tanto números con decimales como sin ellos. Como viste, hay lookahead y lookbehind positivos y negativos, no consumen caracteres y puedes combinarlos en un mismo patrón, aunque su soporte varía según el motor.
¿Con qué caso de extracción o validación vas a probar tus primeros lookaround? Cuéntamelo en los comentarios.