Toolypet
Back to Blog
Dev

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.

Toolypet Team7 min read
Hoja de Referencia de Expresiones Regulares: Patrones de Uso Frecuente

¿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.

SimboloSignificadoEjemplo
.Cualquier caracter excepto salto de lineaa.c -> abc, adc, a1c
\dDigito (0-9)\d+ -> 123, 4567
\DNo digito\D+ -> abc, !@#
\wCaracter de palabra (a-z, A-Z, 0-9, _)\w+ -> hello_123
\WNo caracter de palabra\W -> espacios, caracteres especiales
\sEspacio en blanco (espacio, tab, salto de linea)\s+ -> multiples espacios
\SNo espacio en blanco\S+ -> palabra continua

Cuantificadores: Expresando repeticion

Los cuantificadores especifican cuantas veces se repite el elemento anterior.

SimboloSignificadoEjemplo
*0 o masab* -> a, ab, abb, abbb
+1 o masab+ -> ab, abb, abbb
?0 o 1colou?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.

SimboloSignificadoEjemplo
^Inicio de cadena^Hello -> coincide en "Hello World"
$Fin de cadenaWorld$ -> coincide en "Hello World"
\bLimite de palabra\bcat\b -> solo "cat", no "catch"
\BNo 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-255
  • 2[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

  1. Usar anclas: Limitar el alcance claramente con ^ y $
  2. Usar clases de caracteres especificas: En lugar de .*, usar [^<]* para limitar
  3. 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

CaracteristicaJavaScriptPythonJava
Sintaxis/pattern/flagsr'pattern'Pattern.compile("pattern")
UnicodeFlag /uSoporte nativoPattern.UNICODE_CASE
Grupos nombrados(?<name>...)(?P<name>...)(?<name>...)
LookaheadSoportadoSoportadoSoportado
LookbehindLongitud variable limitadaSoportadoSoportado

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.

RegexRegular ExpressionValidationPattern Matching