Regex: Bandera sticky "y", búsqueda en una posición
JavaScript ofrece herramientas poderosas para manipular cadenas. La bandera sticky (y) en expresiones regulares ocupa un lugar único entre ellas.
La bandera y — la bandera sticky — es una de las banderas que puedes agregar a una expresión regular de JavaScript. Ancla cada búsqueda a una posición exacta: el lastIndex de la expresión regular. Si una coincidencia no puede comenzar exactamente en lastIndex, la búsqueda falla — el motor no avanza buscando una coincidencia en otro lugar.
Esta página explica qué hace la bandera sticky, en qué se diferencia de la bandera global (g), cómo se lee y actualiza lastIndex, los errores más comunes y cuándo vale realmente la pena usar esta bandera (tokenizadores y analizadores secuenciales).
El concepto de la bandera sticky (y)
La bandera sticky (y) garantiza que la coincidencia comience exactamente en el índice almacenado en la propiedad lastIndex del objeto de expresión regular. Este es el contraste clave con la bandera global (g): g permite que el motor avance desde lastIndex para encontrar la siguiente coincidencia en cualquier parte posterior de la cadena, mientras que y requiere que la coincidencia comience en lastIndex o no se produce. Ese comportamiento de "no avanzar" es exactamente lo que necesita un tokenizador — garantiza que la entrada se consuma de forma contigua, sin brechas inesperadas entre tokens.
y no avanza — g sí lo hace
La forma más clara de ver la diferencia es darle a ambas banderas un patrón que no coincida en la posición 0:
La bandera g encuentra abc aunque comienza en el índice 3. La bandera y devuelve null, porque la posición 0 tiene un ., no el inicio de abc.
En el ejemplo anterior, la bandera y garantiza que la segunda llamada a test comience a coincidir en la posición inmediatamente posterior a la coincidencia anterior. Hay dos detalles que vale la pena destacar:
- Una coincidencia exitosa avanza
lastIndexal índice justo después de la coincidencia (0 → 3 → 6). Este avance automático es lo que permite llamar atest/execen un bucle. - Una coincidencia fallida reinicia
lastIndexa 0. Después de que la tercera llamada devuelvafalse,lastIndexvuelve a 0, listo para empezar de nuevo.
lastIndex se lee y se escribe
lastIndex no es solo una entrada que tú estableces — el motor lo actualiza en cada llamada a test/exec que usa y (o g). Por lo tanto, el patrón habitual es: establecer lastIndex una vez si deseas comenzar en un lugar distinto de 0, y luego dejar que el bucle lo gestione.
Sticky también afecta a los anclajes
Con la bandera y, el anclaje de inicio de cadena ^ no se reancla a lastIndex — ^ aún significa "inicio de toda la cadena" (o inicio de una línea con la bandera m). El comportamiento sticky proviene de la regla implícita "coincidir en lastIndex", no de reescribir ^. Por tanto, un patrón como /^x/y fallará con cualquier lastIndex mayor que 0, porque ^ nunca puede satisfacerse allí.
Aplicaciones prácticas de la bandera sticky
Análisis de flujos de datos
La bandera sticky es especialmente ventajosa al analizar flujos de datos donde necesitas hacer coincidir tokens de forma secuencial.
Tokenización de cadenas
Otro caso de uso común es la tokenización de cadenas, donde necesitas asegurarte de que el tokenizador avance de una coincidencia a la siguiente sin omitir ningún carácter.
Búsqueda en una posición específica
La propiedad lastIndex de JavaScript combinada con la bandera sticky se puede usar para buscar patrones a partir de una posición específica en una cadena.
En este ejemplo, establecer lastIndex en 6 permite que el método test encuentre la palabra "world" a partir de la posición especificada.
Combinación de la bandera sticky con otras banderas
La bandera sticky se puede combinar con otras banderas como g (global) para mejorar las capacidades de coincidencia de patrones. En este ejemplo, la bandera g permite una búsqueda global en toda la cadena, mientras que la bandera y garantiza que cada coincidencia comience exactamente en la posición lastIndex. Esta combinación permite realizar una búsqueda global con el comportamiento de coincidencia secuencial estricto de la bandera sticky.
En este ejemplo, actualizamos la expresión regular para consumir el delimitador de coma. Esto garantiza que la siguiente coincidencia comience en la posición correcta sin manipulación manual del índice.
Ejemplos avanzados
Extracción de pares clave-valor
Considera un escenario más complejo donde necesitas extraer pares clave-valor de una cadena con varios separadores. Cada parte del par se extrae con un grupo de captura — match[1] es la clave y match[3] es el valor.
Análisis de registros
La bandera sticky puede ser increíblemente útil al analizar registros estructurados donde las entradas deben coincidir desde posiciones específicas.
Nótese que el grupo del mensaje es [^;]+ ("todo hasta el siguiente ;") en lugar de \w+. Con \w+, un mensaje que contenga un espacio detendría la coincidencia a mitad de entrada; dado que la bandera sticky se niega a avanzar, el siguiente exec fallaría y el bucle terminaría antes de tiempo — descartando silenciosamente las entradas restantes. Este es el error más común con la bandera sticky: tu patrón debe consumir la entrada de forma contigua, o el análisis se detiene abruptamente.
Cuándo usar y (y cuándo no)
Recurre a la bandera sticky cuando:
- Estás escribiendo un tokenizador o analizador y necesitas consumir la entrada de forma contigua, un token a la vez, sin brechas permitidas.
- Quieres comprobar si un patrón coincide en una posición exacta, sin que el motor se desvíe a buscar una coincidencia más adelante en la cadena.
Prefiere la bandera global simple (g) cuando simplemente quieres todas las coincidencias en cualquier parte de la cadena y no te importa si son adyacentes — por ejemplo, encontrar todas las direcciones de correo electrónico en un documento.
Recuerda las dos reglas que causan la mayoría de los errores con la bandera sticky: una coincidencia fallida reinicia lastIndex a 0, y tu patrón debe consumir cada carácter entre coincidencias o el bucle terminará antes de tiempo.
Conclusión
La bandera sticky (y) cambia la conveniencia de "buscar en cualquier parte" de g por una coincidencia estricta bloqueada en la posición lastIndex. Ese intercambio es exactamente lo que necesitas al construir tokenizadores y analizadores secuenciales, donde el consumo contiguo es fundamental. Combínala con grupos de captura para extraer datos estructurados, y mantén un ojo en lastIndex — una vez que entiendas cómo avanza y se reinicia, la coincidencia sticky se convierte en una herramienta precisa y predecible.
Temas relacionados
- Patrones y banderas
- Anclajes: inicio
^y fin$de cadena - Grupos de captura
- Expresiones regulares en JavaScript