Expresiones regulares (Regex): guía práctica con ejemplos reales
Qué son las expresiones regulares?
Las expresiones regulares (regex o regexp) son patrones de texto que describen conjuntos de cadenas de caracteres. Son una de las herramientas más potentes y universales en programación: permiten buscar, validar, extraer y reemplazar texto con una precisión imposible de conseguir con búsquedas simples.
Nacieron en los años 50 como concepto matemático (autómatas finitos) y se incorporaron a la informática a través de editores de texto Unix como ed y grep. Hoy están integradas en prácticamente todos los lenguajes de programación, editores de código, bases de datos y herramientas de línea de comandos.
Si alguna vez has necesitado verificar que un email tiene formato válido, extraer todos los números de un documento, o reemplazar fechas de un formato a otro, las regex son la solución óptima.
intaxis básica: los bloques fundamentales
aracteres literales y metacaracteres
Un patrón regex puede contener caracteres literales (que coinciden consigo mismos) y metacaracteres (que tienen significado especial):
| Metacarácter | Significado | Ejemplo |
|---|---|---|
| `.` | Cualquier carácter excepto salto de línea | `a.c` coincide con "abc", "a1c", "a-c" |
| `^` | Inicio de línea | `^Hola` coincide con "Hola mundo" |
| `$` | Fin de línea | `fin$` coincide con "es el fin" |
| `*` | Cero o más repeticiones | `ab*c` coincide con "ac", "abc", "abbc" |
| `+` | Una o más repeticiones | `ab+c` coincide con "abc", "abbc" pero no "ac" |
| `?` | Cero o una repetición | `colou?r` coincide con "color" y "colour" |
| `\` | Escape de metacarácter | `\.` coincide con un punto literal |
lases de caracteres
Las clases de caracteres definen conjuntos de caracteres aceptables en una posición:
[abc] — coincide con "a", "b" o "c"[a-z] — cualquier minúscula[A-Z0-9] — cualquier mayúscula o dígito[^abc] — cualquier carácter excepto "a", "b" o "c" (negación)Los atajos predefinidos ahorran tiempo:
\d — equivale a [0-9] (dígito)\w — equivale a [a-zA-Z0-9_] (carácter de "palabra")\s — equivale a [ \t\n\r] (espacio en blanco)\D, \W, \S — las negaciones respectivasuantificadores específicos
Cuando necesitas repeticiones exactas:
{3} — exactamente 3 repeticiones{2,5} — entre 2 y 5 repeticiones{3,} — 3 o más repeticionesEjemplo: \d{2}/\d{2}/\d{4} coincide con fechas como "25/03/2026".
rupos y alternancia
(abc) — grupo de captura: agrupa y captura el contenido(?:abc) — grupo sin captura: agrupa sin capturara|b — alternancia: coincide con "a" o con "b"Ejemplo: (gato|perro)s? coincide con "gato", "gatos", "perro", "perros".
jemplos prácticos esenciales
alidar un email (simplificado)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Este patrón verifica la estructura básica de un email: caracteres válidos antes de la @, dominio con puntos, y extensión de al menos 2 caracteres. La validación completa de emails según RFC 5322 es extremadamente compleja, pero este patrón cubre el 99.9% de los casos reales.
xtraer URLs de un texto
https?://[^\s<>"']+
Coincide con URLs que empiezan por http o https, seguidas de cualquier carácter que no sea espacio ni ciertos delimitadores.
alidar un teléfono español
^(\+34)?[\s-]?[6789]\d{8}$
Acepta formatos como "+34 612345678", "612345678", "912345678" (fijos y móviles españoles).
uscar direcciones IP
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
Encuentra patrones tipo "192.168.1.1". Los \b son límites de palabra para evitar coincidencias parciales dentro de números más largos.
eemplazar formato de fecha
Para convertir "2026-03-25" a "25/03/2026" en JavaScript:
const texto = "Fecha: 2026-03-25";
const resultado = texto.replace(
/(\d{4})-(\d{2})-(\d{2})/g,
"$3/$2/$1"
);
// "Fecha: 25/03/2026"
Los grupos de captura () se referencian con $1, $2, $3 en la cadena de reemplazo.
egex en JavaScript
JavaScript integra regex de forma nativa:
// Crear regex
const regex1 = /patron/flags;
const regex2 = new RegExp("patron", "flags");
// Métodos principales
regex.test(string) // true/false
string.match(regex) // array de coincidencias
string.replace(regex, reemplazo)
string.split(regex)
// Flags comunes
// g - global (todas las coincidencias)
// i - case insensitive
// m - multilinea
// s - dotAll (el . incluye \n)
jemplo real: extraer hashtags
const texto = "Me encanta #JavaScript y #WebDev para el #frontend";
const hashtags = texto.match(/#[\w\u00C0-\u024F]+/g);
// ["#JavaScript", "#WebDev", "#frontend"]
El rango \u00C0-\u024F incluye caracteres acentuados, necesarios para idiomas como el español.
egex en Python
Python usa el módulo re:
import re
# Buscar primera coincidencia
match = re.search(r'\d+', 'Hay 42 elementos')
if match:
print(match.group()) # "42"
# Todas las coincidencias
numeros = re.findall(r'\d+', 'Hay 42 de 100 elementos')
# ['42', '100']
# Reemplazar
limpio = re.sub(r'\s+', ' ', 'texto con espacios')
# "texto con espacios"
# Compilar para rendimiento
patron = re.compile(r'^[a-z]+$', re.IGNORECASE)
patron.match("Hola") # Match object
rrores comunes y cómo evitarlos
\. y no .. El punto sin escapar coincide con cualquier carácter.* y + son codiciosos (consumen lo máximo posible). Añade ? para hacerlos perezosos: .*? consume lo mínimo necesario. Esto es crucial al extraer contenido entre delimitadores.^ y $, tu patrón de validación puede coincidir con una subcadena en lugar del texto completo. \d{9} coincide dentro de "abc123456789xyz", pero ^\d{9}$ solo con exactamente 9 dígitos.(a+)+$ pueden provocar tiempos de ejecución exponenciales. Evita patrones donde un cuantificador contiene otro que coincide con los mismos caracteres.r'patron' para evitar que Python interprete las barras invertidas antes de que lleguen al motor regex.erramientas para aprender y probar regex
Probar regex en un editor de texto es lento e ineficiente. Usa herramientas dedicadas:
onclusión
Las expresiones regulares son una habilidad fundamental para cualquier persona que trabaje con texto y datos. Aunque la curva de aprendizaje puede parecer empinada, dominar los conceptos básicos (clases de caracteres, cuantificadores, grupos y anclas) cubre el 90% de los casos de uso reales. Practica con nuestro testador de regex y guarda tus patrones más útiles como referencia.