我该如何验证电子邮件地址?

znq*_*znq 312 android email-validation

在Android中验证电子邮件地址(例如来自用户输入字段)的好方法是什么?org.apache.commons.validator.routines.EmailValidator似乎不可用.有没有其他图书馆这样做已经包含在Android中,或者我是否必须使用RegExp?

min*_*iot 1021

另一个选项是从API级别8开始的内置模式:

public final static boolean isValidEmail(CharSequence target) {
  if (TextUtils.isEmpty(target)) {
    return false;
  } else {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
  }
}
Run Code Online (Sandbox Code Playgroud)

模式可查看来源

要么

来自@AdamvandenHoven的一线解决方案:

public final static boolean isValidEmail(CharSequence target) {
  return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
Run Code Online (Sandbox Code Playgroud)

  • 像这样的答案是我不喜欢被接受的答案显示在最顶层,而不是大多数选票的答案. (35认同)
  • +1,但我更喜欢将`(target == null)`替换为`TextUtils.isEmpty(target)`:) (30认同)
  • 简单地将它组合成一行也不会更有意义(可读性):return!TextUtils.isEmpty(target)&& android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); (11认同)
  • 当心。此匹配器接受“email@111.222.333.44444”作为有效电子邮件 (3认同)
  • 直接进入我的lib (2认同)

And*_*yeu 99

下一个模式用于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}" +
          ")+"
      );
Run Code Online (Sandbox Code Playgroud)

你可以使用功能

private boolean checkEmail(String email) {
        return EMAIL_ADDRESS_PATTERN.matcher(email).matches();
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`android.util.Patterns.EMAIL_ADDRESS`? (74认同)
  • 因为它仅存在API级别8 (9认同)

Lut*_*ten 69

从API 8(android 2.2)开始,有一个模式:android.util.Patterns.EMAIL_ADDRESS http://developer.android.com/reference/android/util/Patterns.html

所以你可以用它来验证你的电子邮件串:

private boolean isValidEmail(String email) {
    Pattern pattern = Patterns.EMAIL_ADDRESS;
    return pattern.matcher(email).matches();
}
Run Code Online (Sandbox Code Playgroud)

如果电子邮件有效,则返回true

UPD:此模式源代码是:

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}" +
        ")+"
    );
Run Code Online (Sandbox Code Playgroud)

参考:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/util/Patterns.java

因此,您可以自己构建它以与API <8兼容.


Gle*_*len 47

不要使用注册表.

显然,以下是一个注册表,可以正确验证大多数符合RFC 2822的电子邮件地址,(并且仍然会失败,例如"user@gmail.com.nospam",org.apache.commons.validator也是如此. routines.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])+)\])
Run Code Online (Sandbox Code Playgroud)

可能是验证电子邮件的最简单方法,只需将确认电子邮件发送到所提供的地址,然后它就会反弹,然后它就无效了.

如果您想执行一些基本检查,您可以检查它是否在表单中 *@*

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

  • 我有点困惑为什么你用"不要使用注册表"开始这个答案,然后继续提供一个注册表. (95认同)
  • 请继续阅读.一个更好的解决方案是不使用正则表达式. (6认同)
  • 我知道这个答案大约有两年了,但是当我使用regexr.com尝试这个正则表达式时,它验证了`user @ gmail.com.nospam`,甚至更长的tld像.museum.我错过了什么吗?我不想通过验证他们的有效电子邮件地址来阻止我的任何用户,但这似乎适用于我能想到的任何事情. (5认同)
  • @格伦。这是否适用于 Android 的 **Pattern。电子邮件地址** ?https://developer.android.com/reference/android/util/Patterns.html#EMAIL_ADDRESS (2认同)

Sal*_*zir 45

我们现在有简单的电子邮件模式匹配器

 private static boolean isValidEmail(String email) {
        return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }
Run Code Online (Sandbox Code Playgroud)


Mat*_*teo 16

这是Android Studio的建议:

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


Pan*_*iya 14

使用简单的一行代码进行电子邮件验证

public static boolean isValidEmail(CharSequence target) {
    return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
Run Code Online (Sandbox Code Playgroud)

使用像......

if (!isValidEmail(yourEdittext.getText().toString()) {
    Toast.makeText(context, "your email is not valid", 2000).show();
}
Run Code Online (Sandbox Code Playgroud)


Mud*_*sir 11

您可以使用正则表达式来执行此操作.像下面这样的东西.

Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");

String email = "xyz@xyzdomain.com";

Matcher matcher = pattern.matcher(email);

boolean matchFound = matcher.matches();
Run Code Online (Sandbox Code Playgroud)

注意:检查上面给出的正则表达式,不要按原样使用它.

  • 这在以下有效的电子邮件地址上失败:``Example Guy"<guy@example.com>`.虽然你[技术上可以使用正则表达式验证电子邮件](http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html),但这样做有点荒谬. (3认同)

Vic*_*iah 11

使用android:inputType ="textEmailAddress"如下:

       <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="email"
        android:inputType="textEmailAddress"
        android:id="@+id/email"
        />
Run Code Online (Sandbox Code Playgroud)

和:

       boolean isEmailValid(CharSequence email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email)
                .matches();
      }
Run Code Online (Sandbox Code Playgroud)


Jim*_*tel 9

这里有一个Patternsandroid.util有用的课程.以下是我经常用于验证电子邮件和许多其他内容的方法

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


Dan*_*mes 8

你可以像这样写一个Kotlin扩展:

fun String.isValidEmail() =
        this.isNotEmpty() && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

email.isValidEmail()
Run Code Online (Sandbox Code Playgroud)


Mor*_*eus 8

这是 kotlin 使用扩展函数的最佳方法

fun String.isEmailValid(): Boolean {
        return !TextUtils.isEmpty(this) && android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
    }
Run Code Online (Sandbox Code Playgroud)

  • 不需要 TextUtils.isEmpty(this)。this.isNotEmpty() 是测试非空字符串的标准方法。 (2认同)

Gul*_*hat 6

使用扩展函数的最简单 Kotlin 解决方案:

fun String.isEmailValid() =
            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}" +
                            ")+"
            ).matcher(this).matches()
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样验证:

"testemail6589@gmail.com".isEmailValid()
Run Code Online (Sandbox Code Playgroud)

如果您在 kotlin-multiplatform 中无法访问Pattern,则等效于:

fun String.isValidEmail() = Regex(emailRegexStr).matches(this)
Run Code Online (Sandbox Code Playgroud)


小智 5

我强烈建议您不要尝试“验证”电子邮件地址,否则您只会无缘无故地投入大量工作。

只需确保输入的内容不会破坏您自己的代码 - 例如,没有可能导致异常的空格或非法字符。

其他任何事情只会让你付出大量的努力而回报却微乎其微......

  • 当处理订阅和支付时,这几乎不是有用的建议。如果有人忘记了密码,我们必须有一种安全地重置密码的方法,以允许他们继续使用他们已付费的服务。因此,有时我们最好确保他们输入有效的电子邮件地址。 (3认同)
  • 识别虚假电子邮件的唯一方法是通过向该电子邮件 ID 发送电子邮件并检查您是否收到未送达的报告... (3认同)

Sum*_*rma 5

如果要验证电子邮件ID,请调用此方法.

public static boolean isValid(String email)
{
   String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
   CharSequence inputStr = email;
   Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
   Matcher matcher = pattern.matcher(inputStr);
   if (matcher.matches()) 
   {
      return true;
   }
   else{
   return false;
   }
}
Run Code Online (Sandbox Code Playgroud)


AMI*_*AVA 5

对于电子邮件验证,android提供了一些InBuilt Pattern.但它只支持API级别8及更高版本.

以下是用于检查电子邮件验证的模式的代码.

  private boolean Email_Validate(String email) 
  {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
  }
Run Code Online (Sandbox Code Playgroud)

确保执行此方法后,您应检查如果此方法返回true,则允许保存电子邮件,如果此方法返回false,则显示电子邮件为"无效"的消息.

希望你得到答案,谢谢你.