W3docs

Lookahead y Lookbehind

En este capítulo exploraremos cómo encontrar coincidencias en JavaScript. Aprende a usar Lookahead y Lookbehind de manera práctica y efectiva.

Comprender los temas avanzados de las expresiones regulares en JavaScript es beneficioso para cualquier desarrollador que desee mejorar sus habilidades de programación. Entre las características más avanzadas y potentes de este tema se encuentran las aserciones lookahead y lookbehind. Estas aserciones permiten a los desarrolladores buscar patrones en texto sin incluir dichos patrones en el resultado. Esta guía tiene como objetivo proporcionar una exploración detallada de las aserciones lookahead y lookbehind en JavaScript, con numerosos ejemplos prácticos.

Advertencia

Las expresiones regulares pueden ser complicadas y pueden existir casos extremos. Especialmente cuando se utilizan conceptos avanzados como Lookahead y Lookbehind. Usa comprobadores de regex en línea o escribe pruebas unitarias para validar tus expresiones con una variedad de escenarios de entrada y asegurarte de que se comporten como se espera.

Introducción a las aserciones Lookahead y Lookbehind

Las aserciones lookahead y lookbehind son aserciones de ancho cero, lo que significa que coinciden con una posición dentro del string en lugar de caracteres reales. Nos permiten afirmar si un patrón dado existe o no existe en un punto específico del string. Nota: Los motores de JavaScript modernos (ES2018+) admiten aserciones lookbehind de longitud variable, aunque algunos entornos más antiguos pueden requerir patrones de longitud fija.

Existen cuatro aserciones, formadas combinando dirección (adelante/atrás) con polaridad (positiva/negativa):

AserciónSintaxisSignificado
Lookahead positivo(?=...)El patrón debe seguir este punto
Lookahead negativo(?!...)El patrón no debe seguir este punto
Lookbehind positivo(?<=...)El patrón debe preceder este punto
Lookbehind negativo(?<!...)El patrón no debe preceder este punto

Por qué importa el "ancho cero"

Debido a que las aserciones coinciden con una posición y no con caracteres, el texto que comprueban nunca se incluye en la coincidencia y la posición de lectura del motor de regex no avanza más allá de él. Esto es exactamente lo que las hace útiles: puedes requerir contexto alrededor de una coincidencia sin que ese contexto forme parte del resultado. El fragmento a continuación muestra la diferencia entre un grupo de captura real y un lookahead — ambos verifican que pie sigue a apple, pero solo el grupo consume el texto:

javascript— editable

Si eres nuevo en la sintaxis de grupos (...), consulta Grupos de captura — el lookaround usa los mismos paréntesis pero añade ?=, ?!, ?<=, o ?<! justo después del corchete de apertura.

Lookahead positivo

Una aserción de lookahead positivo comprueba la existencia de un determinado patrón delante de la posición actual en el string. Se denota con (?=...). El siguiente ejemplo es un lookahead positivo para encontrar la palabra "apple" seguida de la palabra "pie":

El lookaround de regexp en Javascript corresponde a caracteres

javascript— editable

Lookahead negativo

Una aserción de lookahead negativo comprueba la ausencia de un determinado patrón delante de la posición actual. Se denota con (?!...). El siguiente ejemplo es un lookahead negativo para encontrar la palabra "apple" que no va seguida de la palabra "pie":

El lookahead negativo en regexp de Javascript

javascript— editable

Lookbehind positivo

Una aserción de lookbehind positivo comprueba la existencia de un determinado patrón detrás de la posición actual en el string. Se denota con (?<=...). A continuación se muestra un ejemplo de código para encontrar la palabra "pie" que está precedida por la palabra "apple":

El lookbehind positivo en regexp de Javascript

javascript— editable

Lookbehind negativo

Una aserción de lookbehind negativo comprueba la ausencia de un determinado patrón detrás de la posición actual. Se denota con (?<!...). Aquí hay un ejemplo para encontrar la palabra "pie" que no está precedida por la palabra "apple":

Lookahead y Lookbehind

javascript— editable

Aplicaciones prácticas de Lookahead y Lookbehind

Validación de la fortaleza de contraseñas

Garantizar contraseñas seguras es un requisito habitual en las aplicaciones web. Las aserciones lookahead se pueden usar para validar diversas condiciones de contraseña sin consumir caracteres.


javascript— editable

Aquí cada (?=...) es un requisito independiente verificado desde el inicio del string. Dado que cada lookahead tiene ancho cero, los cuatro escanean el mismo texto de forma independiente sin interferir entre sí, y el [A-Za-z\d@$!%*?&]{8,} final es lo que realmente consume la contraseña. Los anclajes ^ y $ fijan la comprobación a todo el string, y {8,} es un cuantificador que requiere al menos ocho caracteres.

Formateo y análisis de datos

Las aserciones lookahead y lookbehind pueden ayudar en el formateo y análisis de estructuras de datos complejas. Un buen ejemplo es insertar comas en un string de números para facilitar su lectura:


javascript— editable

Esto funciona reemplazando cada posición vacía (\B, un límite que no es de palabra) que va seguida de un grupo de tres dígitos repetidos hasta el final del número. El (?!\d) al final garantiza que solo se hagan coincidir las posiciones donde los dígitos restantes se dividan en grupos de tres, de modo que no se coloque ninguna coma al principio.

Extraer el importe de un precio

El lookbehind es ideal para obtener un valor que se encuentra después de un marcador conocido sin capturar el marcador en sí. Aquí extraemos el importe numérico que sigue al signo $:

javascript— editable

El lookbehind (?<=\$) requiere un $ inmediatamente antes del número pero lo excluye del resultado, de modo que cada coincidencia contiene solo la cifra. Comparado con el uso de un grupo de captura — un grupo te obligaría a leer el importe de match[1], mientras que el lookbehind coloca el valor directamente en la coincidencia.

Actuar solo cuando algo no sigue

El lookahead negativo te permite actuar en una posición en función de lo que no viene a continuación. Este ejemplo reemplaza hello por HI solo cuando no va seguido de world:

javascript— editable

Temas relacionados

Conclusión

Dominar las aserciones lookahead y lookbehind en JavaScript puede mejorar significativamente tu capacidad para manipular y analizar strings. Estas potentes herramientas proporcionan la flexibilidad necesaria para afirmar patrones sin consumir caracteres, lo que las hace invaluables para tareas complejas de procesamiento de texto. Al aprovechar estas aserciones, los desarrolladores pueden crear expresiones regulares más eficientes y efectivas, lo que conduce a un código más limpio y mantenible.

Práctica

Práctica
¿Cuáles de las siguientes afirmaciones sobre las aserciones lookahead y lookbehind en JavaScript son correctas?
¿Cuáles de las siguientes afirmaciones sobre las aserciones lookahead y lookbehind en JavaScript son correctas?
Was this page helpful?