Las expresiones regulares (regex o regexp) son un mini lenguaje para describir patrones de texto. Sirven para comprobar si un campo tiene el formato correcto, extraer datos de un log, buscar y reemplazar en un editor o limpiar una hoja de cálculo. Al principio parecen jeroglíficos, pero con una docena de símbolos se cubre casi todo. En esta guía tienes una chuleta, ejemplos adaptados a España y Latinoamérica y los errores que más tiempo hacen perder.
Chuleta básica
| Símbolo | Significado | Ejemplo | Coincide con |
|---|---|---|---|
. |
Cualquier carácter (salvo salto de línea) | c.sa |
casa, cosa |
\d |
Dígito 0–9 | \d\d |
42 |
\w |
Letra, dígito o guion bajo (ASCII) | \w+ |
hola_1 |
\s |
Espacio en blanco | a\sb |
a b |
[abc] |
Uno de los caracteres | [aeiou] |
una vocal |
[^abc] |
Cualquiera excepto esos | [^0-9] |
un no dígito |
^ / $ |
Inicio / fin de línea o cadena | ^Hola$ |
exactamente “Hola” |
\b |
Límite de palabra | \bsol\b |
sol, no solar |
a|b |
Alternativa | gato|perro |
gato o perro |
( ) |
Grupo de captura | (\d+)€ |
captura el número |
(?: ) |
Grupo sin captura | (?:ab)+ |
abab |
\ |
Escapa un carácter especial | \. |
un punto literal |
Cuantificadores
| Cuantificador | Significado |
|---|---|
* |
0 o más |
+ |
1 o más |
? |
0 o 1 (opcional) |
{3} |
Exactamente 3 |
{2,4} |
Entre 2 y 4 |
{2,} |
2 o más |
Ejemplos prácticos
Prueba cada patrón en el probador de regex, que resalta las coincidencias y los grupos en tiempo real.
Correo electrónico (validación básica):
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Comprueba que hay algo antes y después de la arroba y un dominio con punto. No intenta cubrir todo el estándar, y no debe: la verificación real es enviar un correo.
DNI español (8 dígitos y letra):
^\d{8}[A-HJ-NP-TV-Z]$
La regex solo comprueba el formato; la letra se calcula con el resto de dividir el número entre 23. La calculadora de la letra del DNI hace esa comprobación.
Teléfono móvil español:
^(?:\+34|0034)?[67]\d{8}$
Teléfono mexicano (10 dígitos, opcional +52):
^(?:\+52)?\d{10}$
Código postal español (01000–52999):
^(?:0[1-9]|[1-4]\d|5[0-2])\d{3}$
Fecha dd/mm/aaaa:
^(0[1-9]|[12]\d|3[01])/(0[1-9]|1[0-2])/\d{4}$
Valida el formato, no la fecha: acepta 31/02/2026. Comprueba la validez real en el código.
Importe con coma decimal (1.234,56):
^\d{1,3}(?:\.\d{3})*(?:,\d{2})?$
Banderas (flags)
| Bandera | Efecto |
|---|---|
i |
Ignora mayúsculas y minúsculas |
g |
Busca todas las coincidencias, no solo la primera |
m |
^ y $ se aplican a cada línea |
s |
. incluye saltos de línea |
u |
Modo Unicode (JavaScript), necesario para \p{L} |
Codicioso frente a perezoso
Por defecto, los cuantificadores son codiciosos: capturan lo máximo posible. Añadiendo ? se vuelven perezosos.
Texto: <b>uno</b> y <b>dos</b>
<b>.*</b>→ captura todo, desde el primer<b>hasta el último</b>.<b>.*?</b>→ captura<b>uno</b>y luego<b>dos</b>.
Reemplazos con grupos
Los grupos capturados se reutilizan en el reemplazo ($1 en JavaScript y muchos editores; \1 en otros):
Convertir 2026-10-08 en 08/10/2026:
Buscar: (\d{4})-(\d{2})-(\d{2})
Reemplazar: $3/$2/$1
Español: tildes y eñes
\w y [a-z] solo cubren letras ASCII. Para nombres en español:
^[a-zA-ZáéíóúüñÁÉÍÓÚÜÑ\s'-]+$
O, en motores con Unicode, ^[\p{L}\s'-]+$ con la bandera u.
Anticipaciones (lookahead)
Las anticipaciones comprueban una condición sin consumir caracteres. Son muy útiles para validar requisitos combinados, como los de una contraseña:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$
Exige al menos una minúscula, una mayúscula, un dígito y 12 caracteres en total. Cada (?=...) mira hacia delante desde el inicio sin avanzar. También existe la anticipación negativa (?!...): ^(?!.*admin).*$ rechaza cualquier texto que contenga “admin”.
Algunos motores admiten además retrospecciones ((?<=...) y (?<!...)). Por ejemplo, (?<=€)\d+ captura el número que va justo después del símbolo del euro.
Regex en distintos lenguajes
// JavaScript
/^\d{5}$/.test('28013'); // true
'2026-10-08'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1');
# Python
import re
re.fullmatch(r'\d{5}', '28013') # coincide
re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', '2026-10-08')
En Python usa cadenas raw (r'...') para no tener que duplicar las barras invertidas.
Errores y trampas frecuentes
- Olvidar las anclas
^y$:\d{5}también coincide dentro de123456789. - No escapar el punto:
www.ejemplo.comtambién coincide conwwwXejemploYcom. - Regex catastróficas: patrones como
(a+)+$pueden tardar muchísimo con ciertas entradas (ReDoS). Evita cuantificadores anidados sobre lo mismo. - Validar todo con regex: para HTML, JSON o fechas reales usa un analizador. Si trabajas con JSON, la guía de JSON explica cómo validarlo.
- Diferencias entre motores: JavaScript, PCRE (PHP), Python y las bases de datos tienen pequeñas diferencias de sintaxis.
Cómo construir un patrón sin perderte
- Escribe ejemplos que deben coincidir y otros que no.
- Empieza por lo literal y sustituye poco a poco las partes variables por clases y cuantificadores.
- Añade anclas cuando quieras validar el texto completo.
- Prueba los casos límite: cadena vacía, espacios al principio o al final, caracteres especiales.
- Comenta los patrones largos en el código o usa el modo extendido (
x) cuando el lenguaje lo permita.
Dónde usar regex
- Validación de formularios (
patternen HTML). - Buscar y reemplazar en VS Code o similares (activa el botón
.*). - Reglas de redirección en
.htaccesso nginx, como explica la guía de redirecciones 301 y 302. - Filtros en Google Analytics y Search Console.
- Limpieza de datos en hojas de cálculo (
REGEXEXTRACTen Google Sheets).