Expresiones regulares de Java: cómo validar correos electrónicos

En esta guía, veremos cómo validar direcciones de correo electrónico en Java, utilizando el paquete regex, así como métodos de cadena incorporados, a través de una expresión regular de correo electrónico de propósito general (RegEx).

Introducción

Las Expresiones Regulares (RegEx) son una poderosa herramienta y nos ayudan a igualar patrones de manera flexible, dinámica y eficiente, así como a realizar operaciones en base a los resultados.

En esta breve guía, veremos cómo validar direcciones de correo electrónico en Java con expresiones regulares.

If you'd like to read more about Regular Expressions and the regex package, read out Guía de expresiones regulares en Java!

Validación de direcciones de correo electrónico en Java

Validar las direcciones de correo electrónico no es difícil; no hay mucha diversidad en el mundo del correo electrónico, aunque hay algunas maneras de hacerlo.

Las expresiones regulares son expresivas, por lo que puede agregar más y más restricciones en función de cómo desea validar los correos electrónicos, simplemente agregando más reglas coincidentes.

Por lo general, puede reducir las cosas a un RegEx bastante simple que se ajuste a la mayoría de los patrones de direcciones de correo electrónico.

Puede ignorar el tipo de organización (.com, .org, .edu), host (gmail, yahoo, outlook) u otras partes de una dirección de correo electrónico, o incluso aplicarlas. .

En las secciones siguientes, veremos algunas expresiones regulares diferentes y qué formatos de correo electrónico admiten o rechazan.

Expresión regular de correo electrónico de propósito general {#expresiónregular de correo electrónico de propósito general}

Un formato de correo electrónico de propósito general es:

1
[correo electrónico protegido]

El tipo de organización es, por convención, 3 caracteres: edu, org, com, etc. Hay bastantes hosts, incluso personalizados, por lo que, en realidad, podría ser cualquier secuencia de caracteres, incluso aaa .

Dicho esto, para una validación bastante flexible (pero aún completamente válida) podemos verificar si String contiene 4 grupos:

  • Cualquier secuencia de caracteres - nombre
  • El símbolo @
  • Cualquier secuencia de caracteres - host
  • Cualquier secuencia de letras de 2-3 caracteres - tipo de organización (io, com, etc).

Esto nos da una expresión regular que se parece a:

1
(.*)(@)(.*)(.[a-z]{2,3})

Para asegurarnos adicionalmente de que no contengan ningún espacio en blanco, podemos agregar algunos controles \S:

1
(\S.*\S)(@)(\S.*\S)(.\S[a-z]{2,3})

Dicho esto, para validar una dirección de correo electrónico en Java, simplemente podemos usar las clases Pattern y Matcher:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
String email = "[correo electrónico protegido]";

Pattern pattern = Pattern.compile("(\\S.*\\S)(@)(\\S.*\\S)(.\\S[a-z]{2,3})");
Matcher matcher = pattern.matcher(email);

if (matcher.matches()) {
    System.out.println("Full email: " + matcher.group(0));
    System.out.println("Username: " + matcher.group(1));
    System.out.println("Hosting Service: " + matcher.group(3));
    System.out.println("TLD: " + matcher.group(4));
}

Esto resulta en:

1
2
3
4
Full email: [correo electrónico protegido]
Username: someone
Hosting Service: gmail
TLD: com

Alternativamente, puede usar el método integrado matches() de la clase String (que solo usa un Pattern y Matcher de todos modos):

1
2
3
4
5
String email = "[correo electrónico protegido]";

if(email.matches("(\\S.*\\S)(@)(\\S.*\\S)(.\\S[a-z]{2,3})")) {
    System.out.println(String.format("Email '%s' is valid!", email));
}

Lo que resulta en:

1
Email '[correo electrónico protegido]' is valid!

¡Impresionante! Este RegEx de propósito general se encargará de casi todas las entradas genéricas y verificará si un correo electrónico sigue la forma genérica que siguen todos los correos electrónicos.

En su mayor parte, esto funcionará bastante bien y no necesitará mucho más que esto. No podrá detectar correos electrónicos no deseados con esto, como:

1
[correo electrónico protegido]

Sin embargo, hará cumplir una cierta forma.

{.icon aria-hidden=“true”}

Nota: Para hacer cumplir ciertos hosts o dominios, simplemente reemplace .* y/o .[a-z]{2,3} con valores reales, como gmail, io y . edu.

Validación sólida de correo electrónico Regex

¿Qué aspecto tiene un RegEx de correo electrónico robusto? Lo más probable es que no te guste, a menos que disfrutes viendo expresiones regulares, que no es un pasatiempo particularmente común.

Para resumir, esto es lo que parece:

1
2
3
4
5
6
7
8
9
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=^_`{|}~-]+)*
|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
@
(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
|\[(?:(?:(2(5[0-5]|[0-4][0-9])
|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])
|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Esta es la expresión regular compatible con RFC5322 que cubre el 99,99 % de las direcciones de correo electrónico de entrada.*

Explicarlo con palabras generalmente está fuera de la mesa, pero visualizarlo ayuda mucho:

*[Imagen y reclamo son cortesía de Correo electrónicoRegex.com]{.small}.

Dicho esto, para crear un verificador de expresiones regulares de verificación de correo electrónico verdaderamente robusto en Java, sustituyamos el suelto con esto:

1
2
3
4
5
6
7
8
String email = "[correo electrónico protegido]";

Pattern pattern = Pattern.compile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])");
Matcher matcher = pattern.matcher(email);

if (matcher.matches()) {
    System.out.println(String.format("Email '%s' is valid!", matcher.group(0)));
}

No hace falta decir que esto funciona:

1
Email '[correo electrónico protegido]' is valid!

Esto no verifica si el correo electrónico existe (no puede verificarlo a menos que intente enviar el correo electrónico a la dirección), por lo que siempre tiene esa posibilidad. Y, por supuesto, incluso esta expresión regular notará direcciones de correo electrónico extrañas como:

1
[correo electrónico protegido]

... son totalmente válidos.

Conclusión

En esta breve guía, hemos analizado cómo realizar la validación de correo electrónico en Java con expresiones regulares.

Cualquier tipo de validación generalmente depende de su proyecto específico, pero hay algunos formularios sueltos/de propósito general que puede aplicar y combinar.

Hemos creado un formulario simple de uso general que funcionará la mayor parte del tiempo, seguido de una expresión regular muy robusta como se detalla en RFC5322. 5322.

Licensed under CC BY-NC-SA 4.0