Hoja de Referencia de Expresiones Regulares: Patrones de Uso Frecuente
Recopilacion de los patrones de expresiones regulares mas utilizados en desarrollo web con ejemplos practicos.

¿Por que aprender expresiones regulares?
Las expresiones regulares (Regular Expression, Regex) son como una navaja suiza para los desarrolladores. Al principio parecen dificiles, pero una vez que te familiarizas con ellas, puedes reemplazar docenas de lineas de codigo de procesamiento de cadenas con una sola linea. La validacion de emails, extraccion de numeros de telefono, parseo de logs, sustitucion de texto - en casi todas las tareas que involucran cadenas, las expresiones regulares brillan.
La razon por la que muchos desarrolladores temen las expresiones regulares es que su sintaxis no se entiende a primera vista. Codigo como /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ parece un mensaje encriptado. Pero una vez que entiendes la sintaxis basica, podras leer este patron logicamente. En este articulo, primero explicaremos la sintaxis fundamental de las expresiones regulares, y luego desglosaremos uno por uno los patrones mas utilizados en la practica.
Entendiendo Sistematicamente la Sintaxis Basica
La sintaxis de las expresiones regulares se puede dividir en cuatro categorias principales: metacaracteres, cuantificadores, grupos y anclas.
Metacaracteres: Caracteres con significado especial
Los metacaracteres representan conjuntos de caracteres o condiciones especificas.
| Simbolo | Significado | Ejemplo |
|---|---|---|
. | Cualquier caracter excepto salto de linea | a.c -> abc, adc, a1c |
\d | Digito (0-9) | \d+ -> 123, 4567 |
\D | No digito | \D+ -> abc, !@# |
\w | Caracter de palabra (a-z, A-Z, 0-9, _) | \w+ -> hello_123 |
\W | No caracter de palabra | \W -> espacios, caracteres especiales |
\s | Espacio en blanco (espacio, tab, salto de linea) | \s+ -> multiples espacios |
\S | No espacio en blanco | \S+ -> palabra continua |
Cuantificadores: Expresando repeticion
Los cuantificadores especifican cuantas veces se repite el elemento anterior.
| Simbolo | Significado | Ejemplo |
|---|---|---|
* | 0 o mas | ab* -> a, ab, abb, abbb |
+ | 1 o mas | ab+ -> ab, abb, abbb |
? | 0 o 1 | colou?r -> color, colour |
{n} | Exactamente n | \d{4} -> 2025 |
{n,} | n o mas | \d{2,} -> 10, 100, 1000 |
{n,m} | Entre n y m | \d{2,4} -> 10, 100, 1000 |
Anclas y Limites
Las anclas hacen coincidencia con posiciones, no con caracteres.
| Simbolo | Significado | Ejemplo |
|---|---|---|
^ | Inicio de cadena | ^Hello -> coincide en "Hello World" |
$ | Fin de cadena | World$ -> coincide en "Hello World" |
\b | Limite de palabra | \bcat\b -> solo "cat", no "catch" |
\B | No limite de palabra | \Bcat -> cat en "catch" |
Grupos y Capturas
Usando parentesis, puedes agrupar patrones y capturar las partes coincidentes.
const dateStr = '2025-12-25';
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const match = dateStr.match(regex);
console.log(match[0]); // '2025-12-25' (coincidencia completa)
console.log(match[1]); // '2025' (primer grupo - ano)
console.log(match[2]); // '12' (segundo grupo - mes)
console.log(match[3]); // '25' (tercer grupo - dia)
Coleccion de Patrones Practicos: Desglose Paso a Paso
1. Validacion de Email
El patron de email es un ejemplo clasico de expresiones regulares. Desgloquemoslo paso a paso.
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
Desglose del patron:
^- Inicio de cadena[a-zA-Z0-9._%+-]+- Parte local (antes de @): una o mas letras, numeros, puntos, guiones bajos, etc.@- Simbolo @ (literal)[a-zA-Z0-9.-]+- Nombre de dominio: una o mas letras, numeros, puntos, guiones\.- Punto (requiere escape)[a-zA-Z]{2,}- Dominio de nivel superior: 2 o mas letras (com, es, museum, etc.)$- Fin de cadena
Manejo de casos limite:
Este patron valida la mayoria de los emails comunes, pero no sigue completamente el estandar RFC 5322. Por ejemplo, emails con comillas como "nombre usuario"@example.com no coincidirian. En la practica, lo mas seguro es validar el formato y luego confirmar enviando un email real.
2. Verificacion de Fortaleza de Contrasena
Para validar reglas de contrasena complejas con expresiones regulares, se utiliza lookahead (busqueda hacia adelante).
// Minimo 8 caracteres, mayusculas, minusculas, numeros y caracteres especiales
const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
Desglose del patron:
(?=.*[a-z])- Debe contener al menos 1 minuscula (lookahead)(?=.*[A-Z])- Debe contener al menos 1 mayuscula(?=.*\d)- Debe contener al menos 1 digito(?=.*[@$!%*?&])- Debe contener al menos 1 caracter especial[A-Za-z\d@$!%*?&]{8,}- 8 o mas caracteres permitidos
El lookahead (?=...) verifica si el patron existe pero no consume caracteres. Esto permite verificar multiples condiciones simultaneamente.
3. Validacion de Numero de Telefono (Espana)
Patron para validar numeros de telefono movil espanoles.
const phoneRegex = /^(\+34|0034)?[6789]\d{8}$/;
Desglose del patron:
(\+34|0034)?- Prefijo de Espana opcional[6789]- Comienza con 6, 7, 8 o 9\d{8}- Seguido de 8 digitos
phoneRegex.test('+34612345678'); // true
phoneRegex.test('612345678'); // true
phoneRegex.test('512345678'); // false (no comienza con 6-9)
4. Validacion de Nombre en Espanol
Para validar nombres en espanol, debemos incluir caracteres acentuados.
const spanishNameRegex = /^[A-Za-zAAEEIIOOUUNNaaeeiioouu]{2,50}$/;
spanishNameRegex.test('Garcia'); // true
spanishNameRegex.test('Jose'); // true
spanishNameRegex.test('A'); // false (menos de 2 caracteres)
5. Validacion de URL
El patron de URL es complejo porque debe soportar varios formatos.
const urlRegex = /^(https?:\/\/)?(www\.)?[\w-]+(\.[a-z]{2,})+([\/\w.-]*)*\/?$/i;
Desglose del patron:
(https?:\/\/)?- Protocolo (http:// o https://) opcional(www\.)?- www. opcional[\w-]+- Nombre de dominio(\.[a-z]{2,})+- Dominio de nivel superior como .com, .es (1 o mas)([\/\w.-]*)*- Ruta (opcional)\/?$- Barra final opcional- Flag
i- Ignorar mayusculas/minusculas
6. Validacion de Direccion IPv4
Cada octeto de una direccion IPv4 debe estar en el rango 0-255. En expresion regular:
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
Desglose del patron (coincidencia 0-255):
25[0-5]- 250-2552[0-4]\d- 200-249[01]?\d\d?- 0-199
ipv4Regex.test('192.168.1.1'); // true
ipv4Regex.test('256.1.1.1'); // false (256 fuera de rango)
ipv4Regex.test('192.168.001.001'); // true (ceros iniciales permitidos)
Optimizacion de Rendimiento
La mayor causa de lentitud en expresiones regulares es el backtracking. Cuando se usan cuantificadores codiciosos excesivamente, el rendimiento puede degradarse drasticamente.
Cuantificadores Codiciosos vs Perezosos
// Codicioso (Greedy) - coincide lo maximo posible
'<div>content</div><div>more</div>'.match(/<div>.*<\/div>/);
// Resultado: '<div>content</div><div>more</div>' (todo)
// Perezoso (Lazy) - coincide lo minimo posible
'<div>content</div><div>more</div>'.match(/<div>.*?<\/div>/);
// Resultado: '<div>content</div>' (solo el primero)
Agregar ? despues del cuantificador lo hace perezoso: *?, +?, ??
Consejos de Optimizacion
- Usar anclas: Limitar el alcance claramente con
^y$ - Usar clases de caracteres especificas: En lugar de
.*, usar[^<]*para limitar - Usar grupos de no captura: Si no necesitas capturar, usar
(?:...)
// Grupo de captura - mas lento (almacena resultado de coincidencia)
/(abc)+/
// Grupo de no captura - mas rapido (no almacena)
/(?:abc)+/
Diferencias entre Lenguajes
| Caracteristica | JavaScript | Python | Java |
|---|---|---|---|
| Sintaxis | /pattern/flags | r'pattern' | Pattern.compile("pattern") |
| Unicode | Flag /u | Soporte nativo | Pattern.UNICODE_CASE |
| Grupos nombrados | (?<name>...) | (?P<name>...) | (?<name>...) |
| Lookahead | Soportado | Soportado | Soportado |
| Lookbehind | Longitud variable limitada | Soportado | Soportado |
Uso de Expresiones Regulares en JavaScript
const str = 'Contactenos en support@example.com o sales@example.com';
const regex = /[\w.-]+@[\w.-]+\.\w+/g;
// Encontrar todas las coincidencias
const emails = str.match(regex);
// ['support@example.com', 'sales@example.com']
// Sustitucion
const masked = str.replace(regex, '[email oculto]');
// 'Contactenos en [email oculto] o [email oculto]'
// Division
'a,b;c:d'.split(/[,;:]/);
// ['a', 'b', 'c', 'd']
// Coincidencia iterativa (matchAll)
for (const match of str.matchAll(/(\w+)@(\w+\.\w+)/g)) {
console.log(`Local: ${match[1]}, Dominio: ${match[2]}`);
}
Usando el Probador de Regex de Toolypet
La parte mas dificil de escribir expresiones regulares es que es dificil obtener retroalimentacion inmediata. El Probador de Regex de Toolypet resuelve este problema:
- Resultados de coincidencia en tiempo real al ingresar patron y cadena de prueba
- Muestra visualmente lo que coincidio cada grupo de captura
- Prueba facilmente diferentes flags (g, i, m) con toggles
- Proporciona plantillas de patrones de uso frecuente
Cuando depures expresiones regulares complejas, es mucho mas eficiente validar primero en Toolypet que probar directamente en el codigo.