【问题标题】:Simple email validation [duplicate]简单的电子邮件验证 [重复]
【发布时间】:2012-01-05 18:48:57
【问题描述】:

可能重复:
Verify email in Java

我正在尝试做一个非常简单的电子邮件验证。但问题是当我尝试类似tom@@@@gmail.com 时,它返回true。

代码如下:

public static boolean validateEmail(String email){
        boolean isValidEmail = false;
       // Input the string for validation
       // String email = "xyz@.com";
       // Set the email pattern string
       Pattern p = Pattern.compile(".+@.+\\.[a-z]+");

       // Match the given string with the pattern
       Matcher m = p.matcher(email);

       // check whether match is found
       boolean matchFound = m.matches();

       StringTokenizer st = new StringTokenizer(email, ".");
       String lastToken = null;
       while (st.hasMoreTokens()) {
          lastToken = st.nextToken();
       }

       if (matchFound && lastToken.length() >= 2
          && email.length() - 1 != lastToken.length()) {


          // validate the country code
          isValidEmail = true;
       }
       else isValidEmail = false;

    return isValidEmail;
}

请帮忙。提前致谢。

【问题讨论】:

    标签: java regex email-validation


    【解决方案1】:

    .+@.+ 将匹配任何内容,包括@,然后是@,然后是任何内容,包括@。请改用[^@]+@[^@]+

    或者停止重新发明轮子,抓住 Apache Commons 并使用它的EmailValidator

    【讨论】:

    • 我将如何使用 Apache Commons?这是我第一次听说。
    • @ChickenBoy:commons.apache.org。这是一个相当不错的图书馆。
    【解决方案2】:

    应该是Pattern p = Pattern.compile(".+@{1}+\\.[a-z]+");

    但是:

    我上面的答案与@larsmans 的答案完全一样是错误的,因为:

    this(comment)me@demo.com 是有效的电子邮件。

    您必须阅读 RFC:https://www.rfc-editor.org/rfc/rfc5322

    其实用一个好的库,如apache-commons。

    【讨论】:

    • 验证电子邮件地址的应用程序没有义务验证电子邮件地址格式的所有变体,因为它们在 Internet 消息中是允许的。此外,如果该地址将用于通过 SMTP 发送电子邮件,请记住 SMTP 允许的电子邮件地址格式受到更多限制,并且不包括 cmets(或者就此而言,除了邮箱名称之外的任何内容, at 标志和 FQDN)。
    • 您从哪里获得这些信息?还有其他 RFC 吗?
    • SMTP 经历了多次修改。 RFC 821 是最新的,已被指定为标准。 SMTP 的最新草案标准是 RFC 5321。
    【解决方案3】:

    这是许多图书馆都解决的问题。不要重新实现你自己的。

    在正则表达式中获得 100% 正确比您想象的要困难得多。

    【讨论】:

      【解决方案4】:

      您可以使用 Javamail API 中的 javax.mail.internet.InternetAddress 类(有一个 validate 方法)

      【讨论】:

      • 我要如何导入它?我试过了,但它不在我的默认 java 库中。我对此很陌生。请帮忙。
      • 它在 Java EE 发行版中。
      • @ChickenBoy 你可以在 Oracle 的网站上下载这个库。只需寻找“javamail”。如果你使用maven,你可以直接在你的pom.xml中添加依赖(mvnrepository.com/artifact/javax.mail/mail/1.4.4)。
      【解决方案5】:

      This site 建议以下模式匹配 RFC 5322 并涵盖当今使用的大多数电子邮件地址:

      Pattern p = Pattern.compile("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", Pattern.CASE_INSENSITIVE);
      

      它适用于我进行的一些快速测试。

      考虑将编译后的模式存储在常量中以提高性能。

      【讨论】:

        猜你喜欢
        • 2014-05-11
        • 1970-01-01
        • 2011-07-16
        • 2016-01-17
        • 2011-06-21
        • 2013-09-25
        • 2012-05-20
        • 2013-01-18
        • 2013-02-12
        相关资源
        最近更新 更多