/ /

Referencia rápida — clic para insertar

¿Qué es una expresión regular?

Una expresión regular (regex o regexp) es una secuencia de caracteres que define un patrón de búsqueda. Se utilizan para búsqueda de cadenas, validación, extracción de texto y reemplazo. Las regex son compatibles con prácticamente todos los lenguajes de programación y son una herramienta esencial para cualquier desarrollador que trabaje con procesamiento de texto.

Referencia rápida de sintaxis regex

  • . — Coincide con cualquier carácter excepto nueva línea
  • ^ / $ — Inicio / fin de cadena (o línea en modo multilínea)
  • * / + / ? — 0 o más / 1 o más / 0 o 1
  • {n,m} — Entre n y m repeticiones
  • [abc] — Clase de caracteres — coincide con a, b o c
  • [^abc] — Clase de caracteres negada
  • (abc) — Grupo de captura
  • (?:abc) — Grupo sin captura
  • \d / \w / \s — Dígito / carácter de palabra / espacio en blanco
  • a|b — Alternancia — coincide con a o b

Patrones regex comunes

  • Email: [\w.+-]+@[\w-]+\.[a-zA-Z]{2,}
  • URL: https?://[\w\-._~:/?#[\]@!$&'()*+,;=%]+
  • IPv4: (\d{1,3}\.){3}\d{1,3}
  • Teléfono (US): (\+1\s?)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}
  • Color hex: #([a-fA-F0-9]{6}|[a-fA-F0-9]{3})
  • Fecha (YYYY-MM-DD): \d{4}-\d{2}-\d{2}

Dominando las Expresiones Regulares: Patrones que Todo Desarrollador Debe Conocer

Las expresiones regulares son una de las herramientas más poderosas en el kit de un desarrollador, pero también una de las más incomprendidas. La clave para escribir regex efectivo es entender los bloques de construcción y combinarlos metódicamente en lugar de intentar escribir patrones complejos desde cero.

Patrones Regex Esenciales para Tareas Comunes

  • Validación de Email: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ — Cubre el 99% de los formatos de email válidos. Para producción, considera usar el validador de email integrado de tu lenguaje en lugar de solo regex.
  • Coincidencia de URL: https?://[^\s/$.?#].[^\s]* — Coincide con URLs HTTP y HTTPS. Simple pero efectivo para extraer enlaces de texto.
  • Dirección IPv4: \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b — Coincide con el formato de dirección IP. No valida rangos.
  • Formato de Fecha (YYYY-MM-DD): \d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) — Coincide con el formato de fecha ISO 8601 con validación básica de mes/día.
  • Fortaleza de Contraseña: ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$ — Requiere al menos 8 caracteres con mayúscula, minúscula, dígito y carácter especial.

Rendimiento de Regex: Evitando el Backtracking Catastrófico

El backtracking catastrófico ocurre cuando un motor de regex se atasca intentando combinaciones exponencialmente numerosas en ciertas entradas. Esto puede congelar tu aplicación o causar ataques ReDoS (Denegación de Servicio por Expresión Regular).

  • Patrón peligroso: (a+)+$ — Con la entrada "aaaaaaaaaaaaaaaaab", toma tiempo exponencial porque el motor intenta cada forma posible de dividir las a's entre los grupos interno y externo.
  • Alternativa segura: a+$ — Aplana los cuantificadores anidados cuando sea posible.
  • Regla general: Evita anidar cuantificadores (como (x+)+, (x*)*, o (x+)*) a menos que estés seguro de que el patrón interno no puede coincidir con los mismos caracteres que la repetición externa.

En aplicaciones de producción, siempre establece un timeout para operaciones regex y considera usar bibliotecas regex que soporten coincidencia en tiempo lineal (como RE2 para Go o rust-regex para Rust).

Sabores de Regex: Diferencias Clave entre Lenguajes

No todos los motores de regex son iguales. Aquí están las diferencias importantes:

  • JavaScript: Sin soporte de lookbehind hasta ES2018. Usa sintaxis /pattern/flags. El flag g es stateful con lastIndex.
  • Python: Usa el módulo re. Soporta grupos nombrados con sintaxis (?P<name>...).
  • Go: Usa motor RE2 — sin backtracking, garantiza tiempo lineal, pero no soporta lookahead/lookbehind.
  • Java: Soporte completo similar a PCRE incluyendo cuantificadores posesivos (a++) y grupos atómicos.

Preguntas frecuentes sobre expresiones regulares

¿Cuál es la diferencia entre .* y .+ en regex?

El asterisco (*) significa "cero o más" del elemento anterior, mientras que el signo más (+) significa "uno o más." El patrón .* coincide con cualquier cadena incluyendo cadenas vacías, mientras que .+ requiere al menos un carácter. Ambos son codiciosos por defecto — coinciden con la mayor cantidad posible. Agregue ? para hacerlos perezosos (coincidir con lo mínimo posible): .*? y .+?.

¿Qué hacen los flags de regex g, i, m y s?

El flag g (global) encuentra todas las coincidencias en lugar de detenerse después de la primera. El flag i hace que la coincidencia sea insensible a mayúsculas. El flag m (multilínea) hace que ^ y $ coincidan con el inicio y fin de cada línea en lugar de toda la cadena. El flag s (dotAll) hace que el punto coincida con caracteres de nueva línea. Combine flags según necesite: /patrón/gim.

¿Cómo coincido con un punto literal, paréntesis u otros caracteres especiales?

Escape los caracteres especiales de regex con una barra invertida. Un punto literal es . (sin la barra invertida, el punto coincide con cualquier carácter). Un paréntesis literal es ( y ). Otros caracteres que necesitan escape: ^ $ | ? * + { } [ ]. Por ejemplo, para coincidir con la URL example.com literalmente, escriba /example.com/ — de lo contrario, el punto coincidiría con cualquier carácter.

¿Cuál es la diferencia entre un cuantificador codicioso y uno perezoso?

Los cuantificadores codiciosos (*, +, {n,m}) intentan coincidir con la mayor cantidad posible mientras permiten que el patrón general coincida. Los cuantificadores perezosos (no codiciosos) (*?, +?, {n,m}?) coinciden con la menor cantidad posible. Por ejemplo, dado <b>negrita</b>, el codicioso /<.*>/ coincide con toda la cadena, mientras que el perezoso /<.*?>/ coincide solo con <b>.

Herramientas relacionadas para desarrolladores