Casi todo proyecto necesita en algún momento comprobar que un texto tiene la forma correcta: un correo en un formulario de registro, un teléfono en un pago, una URL en una página de ajustes. Las expresiones regulares son la herramienta natural, pero copiar un patrón de internet sin entenderlo es la manera en que los errores llegan a producción.
Este artículo reúne patrones prácticos más que perfectos. De cada uno verás qué acepta, dónde se queda corto y cuándo conviene usar algo más robusto. Todos están escritos para JavaScript y funcionan en cualquier navegador moderno o en Node.js.
Una nota sobre validar frente a verificar
Una regex solo puede decirte si un texto tiene forma de correo electrónico. No puede decirte si el buzón existe. La única comprobación fiable de un correo es enviar un mensaje de confirmación. Usa la regex para detectar errores de dedo desde el principio y la verificación para confirmar la propiedad.
Correo electrónico
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Este patrón exige algo de texto, una arroba, más texto, un punto y una parte final de al menos dos caracteres, sin espacios en ninguna parte. Es permisivo a propósito. El estándar completo de correo admite cadenas entre comillas, comentarios y símbolos poco habituales que una regex más estricta rechazaría, y hay personas con direcciones perfectamente válidas que se quedaron fuera por patrones demasiado ingeniosos.
Teléfonos internacionales
^\+?[0-9\s().-]{7,20}$
Acepta un signo más opcional seguido de dígitos, espacios, paréntesis, puntos y guiones, entre 7 y 20 caracteres. Los formatos telefónicos varían enormemente entre países, así que un único patrón estricto es una trampa. Un mejor enfoque es normalizar quitando todo excepto los dígitos y el signo más inicial, y luego comprobar la longitud de lo que queda (entre 8 y 15 dígitos en números internacionales).
URL
^https?:\/\/[^\s/$.?#].[^\s]*$
Exige http o https y después al menos un carácter que no sea espacio. Para validar URLs de verdad en JavaScript, es mejor usar el analizador integrado: new URL(texto) lanza un error cuando la entrada no es una URL absoluta válida y te entrega el protocolo, el host y la ruta ya separados.
Color hexadecimal
^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
Coincide con un numeral seguido de exactamente tres o seis dígitos hexadecimales, así que #fff y #1a1814 pasan, pero #ffff no. El grupo sin captura (?:...) agrupa las alternativas sin guardar la coincidencia.
Fecha en formato AAAA-MM-DD
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Comprueba la forma y los rangos aproximados de mes y día. Aun así acepta 2025-02-31, porque una regex no conoce la duración de cada mes. Tras la coincidencia, crea un objeto Date y compara sus partes para confirmar que la fecha realmente existe.
Reglas de fortaleza de contraseña
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
Las anticipaciones como (?=.*\d) comprueban que algo aparezca más adelante en la cadena sin consumirlo, de modo que el patrón puede exigir una minúscula, una mayúscula y un dígito en cualquier orden, además de un mínimo de ocho caracteres. Las recomendaciones modernas prefieren la longitud a las mezclas obligatorias de caracteres, así que considera simplemente exigir una frase de contraseña larga.
Slug
^[a-z0-9]+(?:-[a-z0-9]+)*$
Palabras en minúsculas y dígitos separados por guiones simples, sin guiones al inicio, al final ni dobles. Es la forma que deberían tener la mayoría de los enlaces permanentes de un CMS.
Dirección IPv4
^((25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(25[0-5]|2[0-4]\d|1?\d?\d)$
Cada una de las cuatro partes debe ser un número de 0 a 255. Las alternativas dentro del grupo cubren por separado los rangos 250-255, 200-249 y 0-199.
Prueba antes de publicar
Pega cada patrón en el probador de regex junto con una mezcla de ejemplos válidos e inválidos. Comprueba que los valores válidos coinciden, los inválidos no, y que los grupos de captura contienen lo esperado. Presta atención a los casos límite: cadenas vacías, espacios extra, entradas muy largas y caracteres no ingleses.
Cuidado con el retroceso catastrófico
Los patrones con cuantificadores anidados como (a+)+$ pueden tardar un tiempo exponencial con ciertas entradas, congelando una página o un servidor. Mantén los patrones simples, evita repeticiones anidadas ambiguas y limita la longitud del texto que validas.
Una buena validación tiene capas: una regex rápida para la forma, un analizador o librería para la estructura y una confirmación real para la verdad.

