¿Cómo debo validar una dirección de correo electrónico?
¿Cuál es una buena técnica para validar una dirección de correo electrónico (por ejemplo, desde un campo de entrada del usuario) en Android? org.apache.commons.validator.routines.EmailValidator no parece estar disponible. ¿Hay otras bibliotecas que hagan esto que ya estén incluidas en Android o tendría que usar RegExp?
Otra opción son los patrones integrados que comienzan con API nivel 8:
public final static boolean isValidEmail(CharSequence target) {
if (TextUtils.isEmpty(target)) {
return false;
} else {
return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
}
Fuente visible de patrones
O
Solución de una línea de @AdamvandenHoven:
public final static boolean isValidEmail(CharSequence target) {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
El siguiente patrón se utiliza en el correo K-9:
public static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile(
"[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
"\\@" +
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
"(" +
"\\." +
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
")+"
);
Puedes usar la función
private boolean checkEmail(String email) {
return EMAIL_ADDRESS_PATTERN.matcher(email).matches();
}
Desde API 8 (android 2.2) existe un patrón: android.util.Patterns.EMAIL_ADDRESS http://developer.android.com/reference/android/util/Patterns.html
Entonces puedes usarlo para validar tuEmailString:
private boolean isValidEmail(String email) {
Pattern pattern = Patterns.EMAIL_ADDRESS;
return pattern.matcher(email).matches();
}
devuelve verdadero si el correo electrónico es válido
UPD: El código fuente de este patrón es:
public static final Pattern EMAIL_ADDRESS
= Pattern.compile(
"[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
"\\@" +
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
"(" +
"\\." +
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
")+"
);
consulte: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/util/Patterns.java
Para que pueda crearlo usted mismo para que sea compatible con API <8.
Ahora tenemos un comparador de patrones de correo electrónico simple.
Java:
private static boolean isValidEmail(String email) {
return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
Función Kotlin:
private fun isValidEmail(email: String): Boolean {
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches()
}
Extensión de Kotlin:
fun String.isValidEmail() =
!TextUtils.isEmpty(this) && Patterns.EMAIL_ADDRESS.matcher(this).matches()
No uses una expresión regular.
Aparentemente, la siguiente es una expresión regular que valida correctamente la mayoría de las direcciones de correo electrónico que cumplen con RFC 2822 (y aún fallará en cosas como " [email protected] ", al igual que org.apache.commons.validator. rutinas.EmailValidator)
(?:[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])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-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])+)\])
Posiblemente la forma más fácil de validar un correo electrónico es simplemente enviar un correo electrónico de confirmación a la dirección proporcionada y si rebota, entonces no es válido.
Si desea realizar algunas comprobaciones básicas, puede comprobar que esté en el formulario*@*
Si tiene alguna validación específica de lógica de negocios, puede realizarla usando una expresión regular, por ejemplo, debe ser una cuenta de gmail.com o algo así.