Flags de Regex: g, i, m, s, u, y
Domina los modificadores de expresiones regulares para controlar el comportamiento de búsqueda, desde coincidencias globales hasta soporte Unicode.
TL;DR - Resumen rápido
- Los flags modifican el comportamiento de búsqueda de las expresiones regulares
- El flag 'g' busca todas las coincidencias, no solo la primera
- El flag 'i' ignora mayúsculas y minúsculas en las coincidencias
- El flag 'm' hace que ^ y $ coincidan con inicio/fin de cada línea
- Los flags 's', 'u' y 'y' manejan casos especiales como dotAll, Unicode y búsqueda sticky
Introducción a los Flags de Regex
Los flags (o banderas) son modificadores que alteran el comportamiento de las expresiones regulares en JavaScript. Se colocan después de la barra de cierre en notación literal o como segundo parámetro del constructor RegExp. Los flags disponibles son: g (global), i (insensitive), m (multiline), s (dotAll), u (unicode) y y (sticky). Combinarlos adecuadamente te permite crear patrones de búsqueda más precisos y eficientes.
Sin flags, una expresión regular solo encuentra la primera coincidencia y distingue entre mayúsculas y minúsculas. Los flags te permiten controlar estos comportamientos y más, adaptando la búsqueda a tus necesidades específicas.
- g (global) - Encuentra todas las coincidencias, no solo la primera
- i (insensitive) - Ignora mayúsculas y minúsculas
- m (multiline) - ^ y $ coinciden con inicio/fin de cada línea
- s (dotAll) - El punto . coincide también con saltos de línea
- u (unicode) - Soporte completo para caracteres Unicode
- y (sticky) - La búsqueda comienza en la posición lastIndex
Orden de los flags
El orden de los flags no afecta el resultado. /patron/gim es equivalente a /patron/mig. Sin embargo, por convención se suele escribir en orden alfabético: gim, gi, im, etc.
Flag g (Global)
El flag global 'g' hace que la expresión regular encuentre todas las coincidencias en el string, no solo la primera. Sin este flag, métodos como match() y exec() solo devuelven la primera coincidencia. El flag global es especialmente útil cuando necesitas reemplazar o extraer múltiples ocurrencias de un patrón.
Comparación: Con y sin Flag Global
Sin el flag global, match() devuelve solo la primera coincidencia. Con el flag, devuelve un array con todas las coincidencias encontradas.
La diferencia es clara: sin 'g', match() solo encuentra la primera ocurrencia de "a". Con 'g', encuentra todas las minúsculas "a" en el texto. Esto es fundamental cuando necesitas procesar todas las coincidencias de un patrón.
Flag Global con replace()
El método replace() también se comporta diferente con el flag global. Sin 'g', solo reemplaza la primera coincidencia. Con 'g', reemplaza todas las ocurrencias del patrón.
Este ejemplo muestra la importancia del flag global en replace(). Sin él, solo se reemplaza la primera palabra. Con el flag, todas las palabras "mundo" son reemplazadas. Esto es esencial para operaciones de limpieza y transformación de texto.
Advertencia: lastIndex con flag global
Cuando usas el flag global con exec(), la propiedad lastIndexdel objeto RegExp se actualiza después de cada coincidencia. Si reutilizas el mismo objeto RegExp sin resetear lastIndex, puede causar comportamientos inesperados. Usa regex.lastIndex = 0 para resetearlo.
Flag i (Insensitive)
El flag insensitive 'i' hace que la búsqueda ignore mayúsculas y minúsculas. Esto significa que "A", "a", "Á" y "á" se consideran equivalentes en la búsqueda. Este flag es esencial cuando trabajas con texto ingresado por usuarios o datos que pueden tener variaciones de capitalización inconsistentes.
Uso Básico del Flag i
El flag 'i' es especialmente útil para búsquedas de texto donde no importa la capitalización, como nombres de usuario, palabras clave o términos de búsqueda.
Sin el flag 'i', la búsqueda distingue entre mayúsculas y minúsculas. Con el flag, "JavaScript", "javascript" y "JAVASCRIPT" coinciden con el mismo patrón. Esto hace las búsquedas más flexibles y amigables para el usuario.
Combinando Flags g e i
Combinar los flags 'g' e 'i' es un patrón muy común para búsquedas globales sin distinguir mayúsculas. Esta combinación es ideal para encontrar todas las ocurrencias de un término independientemente de su capitalización.
La combinación 'gi' encuentra todas las ocurrencias de "javascript" independientemente de cómo estén escritas. Esto es especialmente útil para análisis de texto, búsqueda de palabras clave y normalización de datos.
Unicode y mayúsculas/minúsculas
El flag 'i' funciona con caracteres Unicode, pero tiene limitaciones con algunos caracteres especiales. Para un soporte completo de Unicode con mayúsculas/minúsculas, combina el flag 'i' con el flag 'u'.
Flag m (Multiline)
El flag multiline 'm' afecta el comportamiento de las anclas ^ (inicio) y $ (fin). Sin este flag, ^ coincide solo con el inicio del string y $ solo con el final. Con el flag 'm', ^ coincide con el inicio de cada línea y $ con el final de cada línea. Esto es crucial cuando trabajas con texto multilínea y necesitas procesar cada línea individualmente.
Comportamiento de ^ y $ con Flag m
El flag 'm' cambia fundamentalmente cómo funcionan las anclas ^ y $, permitiéndote trabajar con líneas individuales en lugar del string completo.
Sin el flag 'm', ^ solo coincide al inicio del string completo y $ solo al final. Con 'm', ^ coincide al inicio de cada línea y $ al final de cada línea. Esto te permite validar o extraer información línea por línea de manera eficiente.
Casos de Uso del Flag m
El flag multiline es útil en escenarios como procesamiento de logs, validación de archivos de configuración y análisis de código fuente.
Este ejemplo muestra cómo usar el flag 'm' para validar líneas que comienzan con un prefijo específico. Cada línea se evalúa independientemente gracias a las anclas ^ y $ con el flag multiline.
Mejor práctica para procesamiento multilínea
Cuando procesas texto multilínea, combina el flag 'm' con 'g' para encontrar todas las líneas que coinciden con el patrón. Esto es más eficiente que dividir el string en líneas y procesar cada una por separado.
Flag s (DotAll)
El flag dotAll 's' hace que el punto (.) coincida con cualquier carácter, incluyendo saltos de línea. Por defecto, el punto NO coincide con saltos de línea (\n), lo que puede causar problemas cuando necesitas hacer coincidir texto que abarca múltiples líneas. El flag 's' resuelve esta limitación, permitiendo que el punto coincida con cualquier carácter sin excepción.
Comportamiento del Punto con Flag s
Sin el flag 's', el punto coincide con cualquier carácter excepto saltos de línea. Con 's', el punto coincide con absolutamente todos los caracteres, incluyendo \n, \r y otros caracteres de control.
Sin el flag 's', el patrón /.*/ solo coincide hasta el primer salto de línea. Con 's', el mismo patrón coincide con todo el texto, incluyendo los saltos de línea. Esto es esencial cuando necesitas hacer coincidir bloques de texto multilínea.
Compatibilidad del flag s
El flag 's' fue añadido en ES2018. En navegadores antiguos, puedes usar [\s\S] como alternativa para coincidir con cualquier carácter incluyendo saltos de línea: /[\s\S]*/.
Casos de Uso del Flag s
El flag dotAll es útil para extraer bloques de código HTML, JSON multilínea, o cualquier contenido que abarque múltiples líneas.
Este ejemplo muestra cómo extraer el contenido de una etiqueta HTML que abarca múltiples líneas. Sin el flag 's', el patrón no funcionaría correctamente porque el punto no coincide con los saltos de línea dentro del contenido.
Flag u (Unicode)
El flag Unicode 'u' habilita el soporte completo para caracteres Unicode en expresiones regulares. Sin este flag, JavaScript trata los caracteres Unicode como dos caracteres separados (un par surrogate), lo que causa problemas en la coincidencia. Con el flag 'u', los caracteres Unicode se tratan como una unidad completa, permitiendo coincidencias precisas con emojis, caracteres asiáticos y otros símbolos Unicode.
Comportamiento con Caracteres Unicode
Los caracteres Unicode fuera del BMP (Basic Multilingual Plane) como emojis y algunos caracteres asiáticos requieren el flag 'u' para coincidir correctamente.
Sin el flag 'u', JavaScript trata el emoji como dos caracteres separados (un par surrogate), por lo que el patrón no coincide. Con 'u', el emoji se trata como un solo carácter y la coincidencia funciona correctamente.
Clases de Propiedades Unicode
El flag 'u' también habilita las clases de propiedades Unicode, que te permiten coincidir con caracteres basándote en sus categorías Unicode, como letras, números, emojis, etc.
Las clases de propiedades Unicode como \p{Emoji},\p{Letter} y \p{Number} requieren el flag 'u'. Estas clases son muy potentes para validar y filtrar texto basándote en categorías Unicode.
Propiedades Unicode disponibles
Algunas propiedades útiles: \p{L} (todas las letras),\p{N} (números), \p{Emoji} (emojis),\p{Script=Latin} (script latino), \p{Sc}(símbolos de moneda). Usa \P para negación.
Flag y (Sticky)
El flag sticky 'y' hace que la búsqueda coincida solo comenzando en la posición especificada por la propiedad lastIndex del objeto RegExp. A diferencia del flag global, que busca en cualquier posición después de lastIndex, el flag sticky requiere que la coincidencia comience exactamente en lastIndex. Esto es útil para tokenización y análisis sintáctico donde necesitas procesar el string secuencialmente.
Comportamiento del Flag y
El flag 'y' es más estricto que el flag 'g'. Mientras que 'g' busca en cualquier posición después de lastIndex, 'y' requiere que la coincidencia comience exactamente en lastIndex.
Con el flag 'y', exec() solo encuentra coincidencias que comienzan exactamente en la posición lastIndex. Si no hay coincidencia en esa posición, devuelve null. Esto permite procesar el string de manera controlada y secuencial.
Advertencia: Resetear lastIndex
El flag 'y' usa lastIndex para determinar dónde comenzar la búsqueda. Si reutilizas el mismo objeto RegExp, asegúrate de resetear lastIndex a 0 o establecerlo explícitamente antes de cada búsqueda.
Casos de Uso del Flag y
El flag sticky es ideal para tokenización, análisis sintáctico y procesamiento de strings donde necesitas controlar exactamente dónde ocurren las coincidencias.
Este ejemplo muestra cómo usar el flag 'y' para tokenizar un string. Cada token se extrae secuencialmente comenzando exactamente donde terminó el anterior. Esto es más eficiente y controlado que usar métodos como split().
Combinando Múltiples Flags
Puedes combinar múltiples flags para crear expresiones regulares con comportamientos complejos. Los flags más comúnmente combinados son 'gi' (global + insensitive), 'gm' (global + multiline) y 'gim' (global + insensitive + multiline). La combinación de flags te permite adaptar la expresión regular exactamente a tus necesidades.
Combinaciones Comunes de Flags
Algunas combinaciones de flags son especialmente útiles en ciertos escenarios. Conocer estas combinaciones te ayuda a escribir expresiones regulares más efectivas.
Este ejemplo muestra combinaciones comunes de flags. 'gi' es ideal para búsquedas de texto, 'gm' para procesamiento multilínea, y 'gim' combina ambas capacidades. 'gs' es útil para coincidencias globales que incluyen saltos de línea.
Mejor práctica: Combina flags según necesidad
No agregues flags innecesariamente. Usa solo los flags que realmente necesitas para tu caso de uso. Los flags adicionales pueden causar comportamientos inesperados si no entiendes completamente cómo interactúan entre sí.
Resumen: Flags de Regex
Conceptos principales:
- •Los flags modifican el comportamiento de búsqueda de las expresiones regulares
- •El flag 'g' encuentra todas las coincidencias, no solo la primera
- •El flag 'i' ignora mayúsculas y minúsculas en las coincidencias
- •El flag 'm' hace que ^ y $ coincidan con inicio/fin de cada línea
- •El flag 's' hace que el punto coincida con saltos de línea
- •El flag 'u' habilita soporte Unicode y el flag 'y' búsqueda sticky
Mejores prácticas:
- •Usa 'gi' para búsquedas de texto globales sin distinguir mayúsculas
- •Combina 'm' con 'g' para procesar texto multilínea eficientemente
- •Usa 's' cuando necesites coincidir texto que abarca múltiples líneas
- •Agrega 'u' cuando trabajes con emojis o caracteres Unicode especiales
- •Usa 'y' para tokenización y procesamiento secuencial controlado
- •No agregues flags innecesarios - usa solo los que necesites