Qué Es Realmente una Expresión Regular
Una expresión regular es un lenguaje compacto de patrones para describir conjuntos de cadenas. En lugar de escribir código procedural que recorra el texto carácter a carácter, declaras un patrón y dejas que el motor encuentre cada subcadena que encaja. Las expresiones regulares impulsan la búsqueda y reemplazo, la validación de entradas, el análisis de logs, el resaltado de sintaxis y la tokenización. En JavaScript son objetos de primera clase creados con un literal como /\d+/g o con el constructor RegExp.
Este probador usa el propio motor del navegador, así que lo que ves es exactamente lo que hará tu código de aplicación con el mismo patrón, flags y entrada.
Los Seis Flags y Qué Cambian
- g (global): encuentra todas las coincidencias en lugar de detenerse en la primera. Sin él, solo se devuelve la primera coincidencia.
- i (ignorar mayúsculas): trata mayúsculas y minúsculas como equivalentes, así
/abc/i coincide con "ABC".
- m (multilínea): hace que
^ y $ coincidan al inicio y fin de cada línea, no solo de toda la cadena.
- s (dotall): permite que
. coincida con saltos de línea, algo que no hace por defecto.
- u (unicode): habilita el manejo correcto de puntos de código fuera del plano básico y escapes de propiedad Unicode como
\p{L}.
- y (sticky): ancla la coincidencia al lastIndex del motor, útil para tokenizadores que deben coincidir de forma contigua.
Grupos de Captura y Referencias
Los paréntesis crean grupos de captura, numerados de izquierda a derecha por su paréntesis de apertura. El patrón (\w+)@(\w+) captura la parte local y el dominio de una dirección simple en los grupos 1 y 2. Los grupos con nombre, escritos (?<year>\d{4}), permiten referenciar capturas por nombre en lugar de por posición, lo que mantiene legibles los patrones complejos. Los grupos sin captura (?:…) agrupan sin consumir un número, lo que importa cuando solo necesitas agrupar para una alternancia o cuantificador.
En los reemplazos referencias capturas con $1, $2 o $<nombre>. El token $& inserta toda la coincidencia y $$ inserta un dólar literal. El panel de Sustitución de esta herramienta previsualiza exactamente cómo se expanden esos tokens.
Cuantificadores Codiciosos vs Perezosos
Por defecto, los cuantificadores como *, + y {2,} son codiciosos: coinciden con todo lo posible y retroceden si hace falta. Añadir ? los hace perezosos, coincidiendo con lo mínimo posible. La trampa clásica es <.*> contra <a><b>, que coincide con toda la cadena de una vez. La versión perezosa <.*?> coincide con cada etiqueta por separado. Ver cómo se actualiza el resaltado al añadir el ? hace la diferencia evidente.
Errores Comunes
- Olvidar escapar caracteres especiales: un punto, más o paréntesis literal debe escribirse
\., \+, \(. Un punto sin escapar coincide con cualquier carácter.
- Retroceso catastrófico: cuantificadores anidados como
(a+)+ en ciertas entradas pueden tardar un tiempo exponencial. Prefiere patrones específicos cuando sea posible.
- Asumir que . coincide con saltos de línea: no lo hace salvo que actives el flag s. El texto multilínea suele necesitar m y s según la intención.
- Reutilizar un regex global: un RegExp con
/g arrastra lastIndex entre llamadas, lo que puede provocar coincidencias saltadas si reutilizas el mismo objeto en bucles.
- Validar solo con regex: algunos formatos, como correos o HTML, son notoriamente difíciles de validar por completo con una sola expresión. Usa regex para una comprobación de forma inicial y luego verifica semánticamente.
Dónde Encaja Regex y Dónde No
Las expresiones regulares destacan en la coincidencia léxica de patrones: extraer tokens, validar formas y buscar y reemplazar. Son una mala opción para analizar estructuras anidadas recursivamente como paréntesis equilibrados, HTML completo o JSON, donde un analizador real es la herramienta adecuada. Conocer el límite ahorra horas: usa regex en patrones planos y cambia a un analizador cuando la gramática se anida.