Las expresiones regulares tienen fama de parecer ruido aleatorio. Un patrón como ^[\w.-]+@[\w-]+\.\w{2,}$ puede parecer como si un gato hubiera caminado sobre el teclado. Pero detrás de la sintaxis críptica se esconde una idea notablemente elegante: un lenguaje conciso para describir patrones en texto.
Ya sea que estés validando entradas de formulario, buscando en archivos de registro, limpiando datos o haciendo buscar y reemplazar en toda una base de código, regex es una de las herramientas más versátiles en el kit de un desarrollador. Y no necesitas memorizar cada característica oscura para obtener un valor real. Un puñado de bloques de construcción cubre la gran mayoría de los casos prácticos.
Qué hace realmente regex
Una expresión regular (regex o regexp) es un patrón que describe un conjunto de cadenas. Se lo proporcionas a un motor de búsqueda — en tu lenguaje de programación, editor de texto o herramienta de línea de comandos — y encuentra cada cadena que coincida.
Piensa en ello como una consulta de búsqueda mejorada:
- Búsqueda normal: encontrar la palabra exacta "error"
- Búsqueda con regex: encontrar cualquier cosa que se parezca a una dirección IP, una fecha, una dirección de correo electrónico o cualquier estructura que puedas describir
Regex fue inventado por el matemático Stephen Kleene en 1956 y entró en la informática a través de los editores de texto Unix en los años 60. Hoy es compatible con prácticamente todos los lenguajes de programación y editores de texto.
Los bloques de construcción
Caracteres literales
La regex más simple es texto plano. El patrón hello coincide con la cadena "hello" donde sea que aparezca. Nada elaborado.
El punto (.) — cualquier carácter
Un punto coincide con cualquier carácter individual excepto un salto de línea.
h.tcoincide con "hat", "hit", "hot", "h3t" e incluso "h t"
Clases de caracteres ([])
Los corchetes definen un conjunto de caracteres permitidos en una posición.
[aeiou]— cualquier vocal[0-9]— cualquier dígito[A-Za-z]— cualquier letra[^0-9]— cualquier carácter que NO sea un dígito (el^dentro de los corchetes significa "no")
Clases abreviadas
| Abreviatura | Significado | Equivalente |
|---|---|---|
\d |
Cualquier dígito | [0-9] |
\w |
Carácter de palabra | [A-Za-z0-9_] |
\s |
Espacio en blanco | [ \t\n\r] |
\D |
No es un dígito | [^0-9] |
\W |
No es carácter de palabra | [^A-Za-z0-9_] |
\S |
No es espacio en blanco | [^ \t\n\r] |
Cuantificadores — cuántos
Los cuantificadores controlan cuántas veces debe aparecer el elemento anterior.
| Símbolo | Significado | Ejemplo | Coincide con |
|---|---|---|---|
* |
Cero o más | ab*c |
"ac", "abc", "abbc" |
+ |
Uno o más | ab+c |
"abc", "abbc" (no "ac") |
? |
Cero o uno | colou?r |
"color" y "colour" |
{3} |
Exactamente 3 | \d{3} |
"123", "456" |
{2,4} |
Entre 2 y 4 | \d{2,4} |
"12", "123", "1234" |
Anclas — posición
^— inicio de la cadena (o línea, con la banderam)$— fin de la cadena (o línea)\b— límite de palabra
El patrón ^\d{4}$ coincide con una cadena que es exactamente cuatro dígitos, como "2026", pero no con "abc2026" ni "2026xyz".
Grupos y alternancia
(abc)— captura "abc" como grupoa|b— coincide con "a" o "b"(cat|dog)— coincide con "cat" o "dog"
Los grupos también permiten aplicar cuantificadores a secuencias: (ha)+ coincide con "ha", "haha", "hahaha".
Patrones prácticos comunes
Validar un correo electrónico (básico)
^[\w.-]+@[\w-]+\.\w{2,}$
Esto coincide con user@example.com, first.last@company.co.uk (parcialmente) y rechaza cadenas sin @ o dominio.
Importante: Validar perfectamente direcciones de correo electrónico con regex es notoriamente difícil — la especificación completa RFC 5322 es extremadamente compleja. Para sistemas en producción, usa un regex básico para verificar el formato y luego verifica la dirección enviando un correo de confirmación.
Coincidir un número de teléfono
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
Esto maneja formatos como +1 555 123 4567, 555-123-4567 y (555) 123-4567.
Coincidir una URL
https?://[\w.-]+(/[\w./?&=-]*)?
Coincide con https://example.com, http://example.com/path?q=hello.
Coincidir una fecha (AAAA-MM-DD)
\d{4}-\d{2}-\d{2}
Coincide con 2026-03-29, 1999-12-31. Nota: esto solo verifica el formato, no la validez — también coincidiría con 9999-99-99.
Banderas que cambian el comportamiento
La mayoría de los motores regex admiten banderas que modifican cómo se aplica el patrón:
| Bandera | Nombre | Efecto |
|---|---|---|
g |
Global | Encontrar todas las coincidencias, no solo la primera |
i |
Sin distinción de mayúsculas | hello coincide con "Hello", "HELLO", etc. |
m |
Multilínea | ^ y $ coinciden con inicio/fin de cada línea |
s |
Dotall | . también coincide con caracteres de salto de línea |
En JavaScript, las banderas se añaden después de la barra de cierre: /hello/gi. En Python, se pasan como argumentos: re.findall(r"hello", text, re.IGNORECASE).
Cuándo regex es excesivo
Regex es poderoso, pero no siempre es la herramienta correcta:
- Analizar HTML o XML. Usa un parser DOM adecuado. Regex no puede manejar de forma fiable etiquetas anidadas.
- Analizar JSON. Usa
JSON.parse()o equivalente. Regex fallará con los casos especiales. - Validación compleja. Si tu patrón abarca múltiples líneas y toma cinco minutos leerlo, considera escribir código de validación procedural en su lugar.
- Operaciones simples con cadenas. Si solo necesitas
startsWith(),includes()osplit(), los métodos de cadena simples son más claros y rápidos.
Errores frecuentes
- Olvidar escapar caracteres especiales. El punto
.coincide con cualquier carácter. Para coincidir con un punto literal, usa\.. Lo mismo para(,),[,],+,*,?,{,},^,$,|y\. - Coincidencia codiciosa vs perezosa. Por defecto,
.*es codicioso — coincide con tanto como sea posible. Añade?para hacerlo perezoso:.*?coincide con lo menos posible. Esto importa al extraer contenido entre delimitadores. - Backtracking catastrófico. Cuantificadores anidados como
(a+)+pueden hacer que el motor pruebe un número exponencial de caminos en ciertas entradas, congelando tu programa. Evita la repetición anidada en patrones que se superponen. - Olvidar las anclas. Sin
^y$, tu patrón coincide con subcadenas.\d{3}encuentra "123" dentro de "abc12345". Usa^\d{3}$si necesitas una coincidencia exacta.
Para saber más
La mejor forma de aprender regex es experimentar. Escribe un patrón, pega un texto de prueba y observa qué se resalta. Ajusta e itera hasta que entiendas cómo funciona cada pieza.
- Cómo probar patrones Regex — tutorial interactivo con ejemplos
- Regex Tester — pega tu patrón y datos de prueba, ve las coincidencias resaltadas en tiempo real
