Regex
¿Qué es Regex?
Regex (Regular Expression) es un patrón de texto que define una secuencia de caracteres para buscar, validar y manipular cadenas de texto. Es como un lenguaje especial que describe qué texto estás buscando usando una sintaxis específica de metacaracteres, cuantificadores y grupos que permiten crear patrones muy precisos y flexibles.
¿Para qué sirve Regex?
Las expresiones regulares son fundamentales en programación. Te permiten:
- Validar formatos de datos como emails, teléfonos, URLs y códigos postales.
- Buscar y extraer información específica de textos largos.
- Reemplazar patrones de texto de forma masiva y precisa.
- Limpiar y procesar datos eliminando caracteres no deseados.
- Dividir cadenas de texto basándose en patrones complejos.
- Crear validadores de formularios robustos y flexibles.
¿Cómo funciona?
Imagina Regex como un detector de patrones súper inteligente. Es como darle a alguien una descripción muy específica de lo que buscas: “quiero números que tengan exactamente 3 dígitos, seguidos de un guión, y luego exactamente 4 dígitos más”. El regex encuentra todas las coincidencias que cumplan exactamente esa descripción en cualquier texto.
Ejemplo: Regex básicos
Aquí tienes ejemplos de patrones regex comunes:
// Validar email
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailRegex.test("usuario@email.com")); // true
console.log(emailRegex.test("email-invalido")); // false
// Validar teléfono (formato: xxx-xxx-xxxx)
const phoneRegex = /^\d{3}-\d{3}-\d{4}$/;
console.log(phoneRegex.test("555-123-4567")); // true
console.log(phoneRegex.test("555-12-34567")); // false
// Extraer números de un texto
const numberRegex = /\d+/g;
const texto = "Tengo 25 años y mi hermana tiene 30";
console.log(texto.match(numberRegex)); // ["25", "30"]
// Validar contraseña segura (min 8 chars, 1 mayúscula, 1 número)
const passwordRegex = /^(?=.*[A-Z])(?=.*\d).{8,}$/;
console.log(passwordRegex.test("MiPass123")); // true
console.log(passwordRegex.test("mipass123")); // false (falta mayúscula)
Este ejemplo muestra patrones regex comunes para validación y extracción de datos.
Ejemplo: Regex avanzado para procesamiento de texto
// Función para limpiar y formatear texto
function procesarTexto(texto) {
// Remover espacios múltiples
texto = texto.replace(/\s+/g, ' ');
// Extraer URLs
const urlRegex = /https?:\/\/[^\s]+/g;
const urls = texto.match(urlRegex) || [];
// Extraer mentions (@usuario)
const mentionRegex = /@(\w+)/g;
const mentions = [];
let match;
while ((match = mentionRegex.exec(texto)) !== null) {
mentions.push(match[1]);
}
// Extraer hashtags
const hashtagRegex = /#(\w+)/g;
const hashtags = [];
while ((match = hashtagRegex.exec(texto)) !== null) {
hashtags.push(match[1]);
}
// Censurar palabras (ejemplo básico)
const censorRegex = /\b(palabra1|palabra2)\b/gi;
texto = texto.replace(censorRegex, '***');
return {
textoLimpio: texto.trim(),
urls,
mentions,
hashtags
};
}
// Validador de formularios con regex
class ValidadorFormulario {
constructor() {
this.patrones = {
nombre: /^[A-Za-zÀ-ÿ\s]{2,50}$/,
email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
telefono: /^(\+\d{1,3})?\s?(\d{3})\s?(\d{3})\s?(\d{4})$/,
fecha: /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/\d{4}$/,
codigoPostal: /^\d{5}(-\d{4})?$/,
tarjetaCredito: /^\d{4}\s?\d{4}\s?\d{4}\s?\d{4}$/
};
}
validar(campo, valor) {
if (!this.patrones[campo]) {
throw new Error(`Campo desconocido: ${campo}`);
}
return this.patrones[campo].test(valor);
}
extraerErrores(datos) {
const errores = {};
for (const [campo, valor] of Object.entries(datos)) {
if (!this.validar(campo, valor)) {
errores[campo] = `${campo} tiene un formato inválido`;
}
}
return errores;
}
formatearTelefono(telefono) {
const match = telefono.match(/^(\+\d{1,3})?\s?(\d{3})\s?(\d{3})\s?(\d{4})$/);
if (match) {
const [, codigo, area, numero1, numero2] = match;
return `${codigo || ''}(${area}) ${numero1}-${numero2}`.trim();
}
return telefono;
}
}
// Uso del validador
const validador = new ValidadorFormulario();
const datosUsuario = {
nombre: "Juan Pérez",
email: "juan@email.com",
telefono: "555 123 4567",
fecha: "15/12/2023"
};
console.log('Errores:', validador.extraerErrores(datosUsuario));
console.log('Teléfono formateado:', validador.formatearTelefono(datosUsuario.telefono));
Metacaracteres principales de Regex
.: Cualquier carácter excepto salto de línea*: Cero o más repeticiones del carácter anterior+: Una o más repeticiones del carácter anterior?: Cero o una repetición (opcional)^: Inicio de línea o cadena$: Final de línea o cadena[]: Clase de caracteres (cualquiera dentro de los corchetes)(): Grupos de captura
Cuantificadores y modificadores
// Cuantificadores específicos
const regexDigitos = /\d{3,5}/; // Entre 3 y 5 dígitos
const regexLetras = /[a-z]{2,}/; // Mínimo 2 letras minúsculas
// Clases de caracteres predefinidas
const regexWhitespace = /\s+/; // Espacios en blanco
const regexWord = /\w+/; // Caracteres de palabra (a-z, A-Z, 0-9, _)
const regexDigit = /\d+/; // Dígitos (0-9)
// Modificadores (flags)
const regexGlobal = /patrón/g; // Buscar todas las coincidencias
const regexInsensitive = /patrón/i; // Ignorar mayúsculas/minúsculas
const regexMultiline = /patrón/m; // Modo multilínea
¿Dónde encuentras Regex?
- En validación de formularios web para emails, contraseñas y teléfonos.
- En editores de texto y IDEs para búsqueda y reemplazo avanzado.
- En procesamiento de logs para extraer información específica.
- En web scraping para extraer datos de páginas HTML.
- En análisis de datos para limpiar y estructurar información.
- En sistemas de validación de APIs y bases de datos.
Herramientas útiles para Regex
// Tester online: regex101.com, regexr.com
// Bibliotecas útiles en JavaScript
// Escapar caracteres especiales
function escapeRegex(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
// Crear regex dinámico
function crearPatronBusqueda(terminos) {
const terminosEscapados = terminos.map(escapeRegex);
return new RegExp(`\\b(${terminosEscapados.join('|')})\\b`, 'gi');
}
const patron = crearPatronBusqueda(['JavaScript', 'Python', 'Java']);
console.log(patron.test("Me gusta programar en JavaScript")); // true
Conclusión
Regex es una herramienta poderosa e indispensable para cualquier desarrollador que trabaje con texto. Aunque puede parecer complejo al principio, dominar las expresiones regulares te permitirá realizar validaciones precisas, extraer datos eficientemente y manipular texto de formas que serían muy difíciles con métodos tradicionales. La clave está en practicar con patrones simples y gradualmente construir expresiones más complejas.