在Android中验证电子邮件地址(例如从用户输入字段)的好技术是什么?emailvalidator似乎不可用。还有其他库做这个,包括在Android已经或我必须使用RegExp?


当前回答

在包android中有一个Patterns类。Util在这里是有用的。以下是我经常使用的验证电子邮件和许多其他东西的方法

private boolean isEmailValid(String email) {
    return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

其他回答

这是android.util.Patterns.EMAIL_ADDRESS

(a-zA-Z0-9 + ._ \ % - +) {1256} \ @ [a-zA-Z0-9] [a-zA-Z0-9 -]{0, 64}(。[a-zA-Z0-9] [a-zA-Z0-9 -] {0,25}) +

字符串将匹配它,如果

Start by 1->256 character in (a-z, A-Z, 0-9, +, ., _, %, - , +)  
then 1 '@' character  
then 1 character in (a-z, A-Z, 0-9)  
then 0->64 character in (a-z, A-Z, 0-9, -)  
then **ONE OR MORE** 
         1 '.' character   
    then 1 character in (a-z, A-Z, 0-9)   
    then 0->25 character in (a-z, A-Z, 0-9, -)

例如一些特殊匹配的电子邮件

a@b.c
a+@b-.c
a@b.c.d.e.f.g.h

您可以根据自己的情况修改此模式,然后通过

fun isValidEmail(email: String): Boolean {
    return Patterns.EMAIL_ADDRESS.matcher(email).matches()
}

这是Android Studio的建议:

public static boolean isEmailValid(String email) {
    return !(email == null || TextUtils.isEmpty(email)) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

不要使用reg-ex。

显然,下面是一个正确验证符合RFC 2822的大多数电子邮件地址的reg-ex,(对于“user@gmail.com.nospam”这样的地址仍然会失败,org.apache.commons.validator. 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])+)\])

验证电子邮件最简单的方法可能是向提供的地址发送确认电子邮件,如果它反弹,那么它是无效的。

如果你想执行一些基本的检查,你可以检查它的形式是*@*

如果你有一些业务逻辑特定的验证,那么你可以使用正则表达式来执行,例如必须是gmail.com帐户或其他东西。

请注意,大多数正则表达式对于国际域名(IDN)和新的顶级域名(如.mobi或.info)无效(如果您检查国家代码或.org, .com, .gov等)。

有效的检查应该将本地部分(在at符号之前)和域部分分开。您还应该考虑本地部分和域的最大长度(包括at号在内的255个字符的总和)。

最好的方法是将地址转换为IDN兼容的格式(如果需要),验证本地部分(RFC),检查地址的长度和检查域的可用性(DNS MX查找)或简单地发送电子邮件。

根据模式。EMAIL_ADDRESS,这个邮件是正确的“abc@abc.c”。所以我在模式中修改了正则表达式。EMAIL_ADDRESS并增加了域的最小长度。 下面是Kotlin的函数:

fun isEmailValid(email: String): Boolean =
    email.isNotEmpty() && 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\\-]{1,25}" +
                ")+"
    ).matcher(email).matches()

我只是将域部分从{0,25}改为{1,25}。