Regex para validar email, teléfono y URL — patrones listos para usar
La validación de formularios es uno de los usos más habituales de las expresiones regulares en desarrollo web. Un patrón regex correcto para validar un email, un número de teléfono o una URL puede prevenir datos corruptos en la base de datos, mejorar la experiencia de usuario con feedback inmediato, y reducir el coste de soporte asociado a datos de contacto incorrectos. Esta guía recoge los patrones más robustos y probados para los casos de uso de validación más habituales, listos para probar en WikiPlus Probador de Regex.
Patrón regex para validar emails
La validación de emails con regex es uno de los temas más debatidos en desarrollo web porque el estándar RFC 5321 permite caracteres muy variados. El patrón de equilibrio práctico que rechaza la mayoría de emails inválidos sin falsos positivos es: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$. Este patrón requiere: uno o más caracteres alfanuméricos o . _ % + - antes del @, el símbolo @, uno o más caracteres alfanuméricos . - después del @, un punto, y dos o más letras para el TLD. No valida TLDs reales (acepta .xyz, .museum, .invalid), para eso necesitarías una lista de TLDs. Para validación robusta en producción, combina el regex con una verificación de MX record o un envío de email de confirmación.
Patrón regex para teléfonos españoles
Los números de teléfono españoles tienen 9 dígitos: los fijos empiezan por 8 o 9, los móviles por 6 o 7. El patrón básico para número español sin prefijo internacional es: ^[6-9]\d{8}$. Para aceptar también el prefijo internacional +34 o 0034: ^(\+34|0034)?[6-9]\d{8}$. Para aceptar espacios o guiones entre grupos de dígitos (común en tarjetas de visita): ^(\+34|0034)?[ -]?[6-9]\d{2}[ -]?\d{3}[ -]?\d{3}$. Para validar números internacionales en formato E.164 genérico: ^\+[1-9]\d{6,14}$. El patrón correcto depende de si aceptas solo números españoles o también internacionales.
Patrón regex para URLs
La validación de URLs con regex cubre casos que van desde lo simple a lo extremadamente complejo. Para la mayoría de formularios web, este patrón es suficiente: ^https?://[\w-]+(\.[\w-]+)+(/[\w-./?=&%#]*)?$. Acepta http y https, nombres de dominio estándar con subdominios, y paths opcionales con parámetros de query. No acepta URLs con puertos personalizados ni URLs localhost (para validar localhost, añade |(localhost(:\d+)?) como alternativa antes del $). Para validación permisiva que solo verifica que algo parece una URL, muchos desarrolladores prefieren confiar en el constructor URL de JavaScript: try { new URL(input); return true; } catch { return false; } que es más robusto que cualquier regex.
Patrón regex para códigos postales, DNI y NIF españoles
Código postal español (5 dígitos, empieza por 01-52): ^(0[1-9]|[1-4]\d|5[0-2])\d{3}$. DNI español (8 dígitos + letra de control): ^\d{8}[A-HJ-NP-TV-Z]$. NIE español (X, Y o Z + 7 dígitos + letra): ^[XYZ]\d{7}[A-HJ-NP-TV-Z]$. NIF de empresa español (letra + 7 dígitos + letra o dígito): ^[ABCDEFGHJKLMNPQRSUVW]\d{7}[0-9A-J]$. Estos patrones verifican el formato pero no la validez del dígito/letra de control; para verificar la letra de control del DNI necesitas implementar el algoritmo módulo 23 en código.
Preguntas frecuentes
- ¿Debería usar regex para validar emails en producción?
- Un regex es el primer filtro para detectar emails con formato claramente incorrecto (sin @, sin punto en el dominio, espacios dentro del email). Pero para la validación definitiva, el único método fiable es enviar un correo de confirmación y verificar que el usuario puede recibirlo y hacer clic en el enlace. Un email como a@b.c supera cualquier regex razonable pero puede no ser un email real y funcional.
- ¿Los patrones de esta guía funcionan en Python y PHP también?
- Los patrones son compatibles con JavaScript, Python (módulo re) y PHP (preg_match) con adaptaciones menores de sintaxis. En Python, las cadenas crudas (r'patrón') evitan el doble escape de barras. En PHP, el patrón debe ir delimitado: '/patrón/flags'. La semántica de los patrones es equivalente para todos los casos de esta guía.
- ¿Cómo valido un IBAN español con regex?
- El IBAN español tiene 24 caracteres: ES + 2 dígitos de control + 20 dígitos. El regex para verificar el formato es: ^ES\d{22}$. Para verificar también los dígitos de control, necesitas implementar el algoritmo MOD97 en código: mover los 4 primeros caracteres al final, reemplazar letras por números (A=10, B=11...) y verificar que el resultado módulo 97 es igual a 1. El regex solo verifica el formato, no la validez aritmética.