Command Palette

Search for a command to run...

Lookahead y Lookbehind en Expresiones Regulares

Aprende a usar lookahead y lookbehind para verificar patrones antes o después de una coincidencia sin incluir esos caracteres en el resultado.

Lectura: 12 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Lookahead (?=) verifica que un patrón venga después sin incluirlo en la coincidencia
  • Lookbehind (?<=) verifica que un patrón venga antes sin incluirlo en la coincidencia
  • Las versiones negativas (?! y ?<!) verifican que un patrón NO esté presente
  • Lookbehind requiere que el patrón tenga longitud fija en JavaScript
  • Son útiles para validaciones complejas y extracción de texto condicional

Introducción a Lookahead y Lookbehind

Los lookahead y lookbehind son construcciones de expresiones regulares que te permiten verificar si un patrón existe antes o después de una posición, sin incluir esos caracteres en la coincidencia. A diferencia de los grupos de captura, estas afirmaciones no consumen caracteres del string, lo que las hace ideales para validaciones complejas.

Estas construcciones son especialmente útiles cuando necesitas encontrar un patrón condicionalmente, basándote en lo que viene antes o después, sin querer incluir ese contexto en el resultado de la coincidencia.

  • Lookahead positivo (?=): Verifica que el patrón venga después
  • Lookahead negativo (?!): Verifica que el patrón NO venga después
  • Lookbehind positivo (?<=): Verifica que el patrón venga antes
  • Lookbehind negativo (?<!): Verifica que el patrón NO venga antes

Diferencia clave con grupos de captura

A diferencia de los grupos de captura que incluyen el contenido en la coincidencia, lookahead y lookbehind son afirmaciones de longitud cero que verifican condiciones sin consumir caracteres del string.

Lookahead Positivo (?=)

El lookahead positivo (?=) verifica que el patrón especificado venga inmediatamente después de la posición actual, pero no incluye ese patrón en la coincidencia. Es como decir "encuentra esto SOLO si eso viene después".

Sintaxis Básica

La sintaxis del lookahead positivo es (?=patrón), donde patrón es lo que debe venir después para que la coincidencia sea válida.

lookahead-positivo-basico.js
Loading code...

En este ejemplo, el patrón coincide con números que están seguidos por la palabra "px" (como en "100px" o "50px"), pero solo captura el número, no el "px". El lookahead verifica que "px" esté presente sin incluirlo en la coincidencia.

Validación de Contraseñas

Los lookahead son excelentes para validar contraseñas que cumplen múltiples criterios sin capturar grupos específicos.

lookahead-validacion-password.js
Loading code...

Esta expresión usa múltiples lookahead para verificar que la contraseña tenga al menos 8 caracteres, una mayúscula, una minúscula y un número. Cada lookahead es una condición independiente que debe cumplirse.

Lookahead Negativo (?!)

El lookahead negativo (?!) verifica que el patrón especificado NO venga después de la posición actual. Es como decir "encuentra esto SOLO si eso NO viene después".

Sintaxis Básica

La sintaxis del lookahead negativo es (?!patrón), donde patrón es lo que NO debe venir después para que la coincidencia sea válida.

lookahead-negativo-basico.js
Loading code...

En este ejemplo, el patrón coincide con números que NO están seguidos por la palabra "px". Esto es útil para filtrar valores que no son píxeles, como porcentajes o valores sin unidades.

Excluir Palabras Específicas

El lookahead negativo es útil para excluir ciertas palabras de una coincidencia.

lookahead-excluir-palabras.js
Loading code...

Este patrón coincide con cualquier palabra de 4 letras excepto "test" y "demo". El lookahead negativo (?!(?:test|demo)$) verifica que la palabra no sea "test" o "demo" antes de capturarla.

Lookbehind Positivo (?<=)

El lookbehind positivo (?<=patrón) verifica que el patrón especificado venga inmediatamente antes de la posición actual, pero no incluye ese patrón en la coincidencia. Es como decir "encuentra esto SOLO si eso vino antes".

Sintaxis Básica

La sintaxis del lookbehind positivo es (?<=patrón), donde patrón es lo que debe venir antes para que la coincidencia sea válida.

lookbehind-positivo-basico.js
Loading code...

En este ejemplo, el patrón coincide con números que están precedidos por el símbolo "$" (como en "$100" o "$50"), pero solo captura el número, no el símbolo de dólar.

Extraer Valores Después de Prefijos

El lookbehind positivo es útil para extraer valores que vienen después de prefijos específicos.

lookbehind-extraer-precios.js
Loading code...

Este patrón extrae todos los precios que están precedidos por el símbolo "$", capturando solo el valor numérico sin el símbolo de moneda.

Limitación de longitud fija

En JavaScript, los lookbehind requieren que el patrón tenga longitud fija. No puedes usar cuantificadores como *, + o ? dentro de un lookbehind. Por ejemplo, (?<=\d+) no es válido, pero (?<=\d3) sí lo es.

Lookbehind Negativo (?<!)

El lookbehind negativo (?<!) verifica que el patrón especificado NO venga antes de la posición actual. Es como decir "encuentra esto SOLO si eso NO vino antes".

Sintaxis Básica

La sintaxis del lookbehind negativo es (?<!patrón), donde patrón es lo que NO debe venir antes para que la coincidencia sea válida.

lookbehind-negativo-basico.js
Loading code...

En este ejemplo, el patrón coincide con números que NO están precedidos por el símbolo "$". Esto es útil para encontrar valores que no son precios en dólares.

Filtrar Coincidencias

El lookbehind negativo es útil para filtrar coincidencias basándose en lo que no precede al patrón.

lookbehind-filtrar-numeros.js
Loading code...

Este patrón coincide con números que no están precedidos por el carácter "#", lo que permite filtrar comentarios o referencias especiales.

Casos de Uso Prácticos

Los lookahead y lookbehind tienen múltiples aplicaciones prácticas en desarrollo de software, desde validación de datos hasta extracción de información específica.

Validación de Email

Puedes usar lookahead para validar que un email tenga ciertas características.

caso-uso-validacion-email.js
Loading code...

Este patrón usa lookahead para verificar que el email tenga al menos un carácter antes del @, que tenga un dominio válido y una extensión de al menos 2 caracteres.

Extraer URLs de Texto

Los lookahead y lookbehind son útiles para extraer URLs de texto sin capturar caracteres circundantes.

caso-uso-extraer-urls.js
Loading code...

Este patrón extrae URLs que están entre paréntesis, capturando solo la URL sin los paréntesis circundantes.

Errores Comunes

Estos son los errores más frecuentes que encontrarás al trabajar con lookahead y lookbehind, especialmente cuando estás aprendiendo estas construcciones avanzadas.

Usar Longitud Variable en Lookbehind

En JavaScript, los lookbehind no pueden contener patrones de longitud variable.

error-longitud-variable.js
Loading code...

El error ocurre porque el lookbehind (?<=\d+) tiene longitud variable (el + significa "uno o más"). En JavaScript, los lookbehind deben tener longitud fija.

Orden Incorrecto de Lookahead

El orden de los lookahead afecta el resultado de la coincidencia.

error-orden-lookahead.js
Loading code...

El primer patrón no encuentra ninguna coincidencia porque los lookahead están en el orden incorrecto. El patrón busca una letra mayúscula seguida de una minúscula y luego verifica que venga antes de un número, lo cual es imposible. El segundo patrón corrige el orden.

Resumen: Lookahead y Lookbehind

Conceptos principales:

  • Lookahead (?=) verifica que el patrón venga después sin incluirlo
  • Lookahead negativo (?!) verifica que el patrón NO venga después
  • Lookbehind (?<=) verifica que el patrón venga antes sin incluirlo
  • Lookbehind negativo (?<!) verifica que el patrón NO venga antes
  • Son afirmaciones de longitud cero que no consumen caracteres
  • Lookbehind requiere longitud fija en JavaScript, lookahead no

Mejores prácticas:

  • Usa lookahead para validaciones complejas de contraseñas
  • Usa lookbehind para extraer valores después de prefijos
  • Recuerda que lookbehind requiere longitud fija en JavaScript
  • Combina múltiples lookahead para condiciones complejas
  • Usa versiones negativas para excluir patrones específicos