Regex para validar direcciones de email, URL y números de teléfono
La regex de validación es de las que más se copian, y buena parte está sutilmente mal. Aquí tienes patrones que funcionan en formularios reales, qué hace cada parte y los casos en los que una expresión regular es la herramienta equivocada.
Valida con flexibilidad, verifica de verdad
Una regex puede indicarte que una entrada parece una dirección de email; solo enviar un mensaje demuestra que existe. Los patrones estrictos rechazan a usuarios reales (signos +, dominios largos, nombres internacionales) y, aun así, dejan pasar erratas. Busca patrones que detecten errores obvios y luego verifica.
Direcciones de email
Un patrón pragmático que coincide con casi cualquier dirección real:
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Algo, una @, un dominio con punto y sin espacios. Acepta ada+news@example.co.uk y rechaza ada@example y ada @example.com. Una versión algo más estricta para la parte local:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Esta rechaza direcciones internacionalizadas (como josé@example.com), así que prefiere la primera si tus usuarios son de todo el mundo. En HTML, <input type="email"> ya valida con la regla propia del navegador. Para comprobar que un dominio puede recibir correo, consulta su registro MX con el Comprobador de DNS para email.
URLs
No escribas una regex para URLs: analízala. Todo runtime moderno tiene un parser de URL que conoce las reglas:
function isHttpUrl(value) {
try {
const u = new URL(value);
return u.protocol === 'http:' || u.protocol === 'https:';
} catch {
return false;
}
}
Comprobar el protocolo importa: new URL('javascript:alert(1)') se analiza sin errores, y esa cadena nunca debe acabar en un href. Si necesitas una regex para encontrar URLs en un texto, usa algo sencillo y analiza cada coincidencia después:
https?:\/\/[^\s<>"']+
Divide una URL en protocolo, host, ruta y parámetros de consulta con el Analizador de URL.
Números de teléfono
Los formatos de teléfono varían según el país, así que la regex más segura solo limpia la entrada. Elimina todo excepto los dígitos y un + inicial, y luego comprueba la longitud según E.164 (hasta 15 dígitos):
const clean = input.replace(/(?!^\+)[^\d]/g, '');
const ok = /^\+?[1-9]\d{6,14}$/.test(clean);
Para una validación real por país (prefijos, móvil frente a fijo), usa una biblioteca como libphonenumber. Un patrón solo para Norteamérica, si es lo único que aceptas:
^\(?([2-9]\d{2})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$
Prueba antes de publicar
Pega un patrón en el Probador de Regex con una lista de muestras válidas e inválidas, una por línea, y activa el flag multilínea para que ^ y $ coincidan con cada línea. Si un patrón que heredaste es ilegible, el Explicador de Regex lo desglosa token por token. Ojo con el backtracking catastrófico: los cuantificadores anidados como (a+)+ pueden bloquear un servidor con una entrada diseñada a propósito.