webtrajans
es

Expresiones regulares: chuleta y ejemplos prácticos

Las expresiones regulares permiten buscar, validar y reemplazar texto con patrones. Con una docena de símbolos se resuelven la mayoría de casos reales.

Actualizado: 5 min de lectura

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 de 123456789.
  • No escapar el punto: www.ejemplo.com también coincide con wwwXejemploYcom.
  • 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

  1. Escribe ejemplos que deben coincidir y otros que no.
  2. Empieza por lo literal y sustituye poco a poco las partes variables por clases y cuantificadores.
  3. Añade anclas cuando quieras validar el texto completo.
  4. Prueba los casos límite: cadena vacía, espacios al principio o al final, caracteres especiales.
  5. 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 (pattern en HTML).
  • Buscar y reemplazar en VS Code o similares (activa el botón .*).
  • Reglas de redirección en .htaccess o 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 (REGEXEXTRACT en Google Sheets).

Preguntas frecuentes

¿Qué es una expresión regular?

Un patrón de texto que describe un conjunto de cadenas. Se usa para buscar coincidencias, validar formatos o reemplazar texto en editores, lenguajes de programación y bases de datos.

¿Qué diferencia hay entre .* y .*?

El primero es codicioso y captura todo lo posible; el segundo es perezoso y captura lo mínimo. Con el texto [uno][dos], el patrón \[.*\] abarca todo y \[.*?\] solo [uno].

¿Cómo incluyo la ñ y las tildes en una regex?

Añádelas a la clase de caracteres, por ejemplo [a-zA-ZáéíóúüñÁÉÍÓÚÜÑ], o usa propiedades Unicode como \p{L} con la bandera u en JavaScript.

¿Puedo validar un correo electrónico al 100 % con regex?

No de forma práctica. Una regex sencilla filtra errores obvios; la única validación real es enviar un correo de confirmación.

Guías relacionadas