【问题标题】:Email address validation fails when domain name has a hyphen域名包含连字符时,电子邮件地址验证失败
【发布时间】:2013-04-24 02:29:46
【问题描述】:

我有一个电子邮件地址验证正则表达式,我在这样的代码中使用它:

public class Test {

  public static void main(String[] args) {
    try {
      String lineIwant = "myname@asl.ramco-group.com";
      String emailreg = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
      Boolean b = lineIwant.matches(emailreg);

      if (b == false) {
        System.out.println("Address is Invalid");
      }else if(b == true){
        System.out.println("Address is Valid");
      }
    } catch (Exception e) {

      e.printStackTrace();
      System.out.println(e.getMessage());
    }
  }
}

在示例中的这个特定电子邮件地址上,布尔值返回 false,而这是一个有效的客户电子邮件地址。

我怀疑这是因为 ramcogroup 之间的连字符,因为当我删除它时,布尔值返回 true。

如何更改我的正则表达式以适应这样的电子邮件地址?

【问题讨论】:

  • 不要重新发明轮子 - 使用 EmailValidator 之类的东西。
  • 对于您的信息,我已经查看了该问题,并且正则表达式在此特定电子邮件 ID 上也没有验证
  • 方法之一here
  • @DuncanJones:你介意写一个答案吗?
  • 我不同意副本,所以我重新打开了。我也不理解反对票,因为您提供了很好的示例代码并清楚地描述了您的目标。对我投赞成票。

标签: java regex validation email


【解决方案1】:

您的正则表达式不允许在 @ 符号后使用 -,所以

String emailreg = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";

将“修复”这个特定问题。但电子邮件地址远比这复杂得多。使用正则表达式验证它们不是一个好主意。查看@DuncanJones 的评论。

【讨论】:

    【解决方案2】:

    我建议您不要尝试自己解决此问题。相反,请依赖经过充分测试的解决方案,例如来自commons-validatorEmailValidator

    例如:

    EmailValidator.getInstance().isValid(emailAddressString);
    

    【讨论】:

    • EmailValidator 还为您提供排除本地电子邮件地址的选项,以便必须存在顶级域,这是我的要求。
    • EmailValidator 似乎已弃用,它无法识别最新的 TLD。
    • @Antares 你能举个例子吗?
    • 我使用的是 EmailValidator 1.4,它认为“abcd@domain.email”是一个无效的电子邮件地址。
    • @Antares 看起来这是众所周知的,请参阅VALIDATOR-305。所以我猜你在发布新版本之前会被卡住。
    【解决方案3】:

    您可以使用许多正则表达式验证字符串。点赞here

    但是真的需要最优解吗?不需要您只需要覆盖 99.9999% 已用地址的次优解决方案吗?

    读这个 article

    【讨论】:

      【解决方案4】:

      \\- 添加到@ 之后的正则表达式字符串部分。

      \\ 是一个转义符,告诉 Java 您不想使用破折号,因为它通常用于显示两个值之间的差异。就这样……

      ^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9\\-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$
      

      更新

      Tim 在 cmets 中承认没有必要逃跑!

      我自己的一个快速提示是,您可能想使用\w 代替[A-Za-z0-9_],这样您就不必一遍又一遍地写。最后熟悉this site。一旦你开始使用正则表达式,它就会有很大的帮助。

      【讨论】:

      • 不完全。首先,破折号用于表示两个字符之间的 范围,而不是区别(但也许这就是您的意思)。其次,如果破折号是字符类中的最后一个字符(或第一个字符),则不需要对其进行转义。
      • 今天学到了一些新东西,谢谢蒂姆,我不知道。我总是谨慎行事并添加我的逃生路线,但这是一个很好的提示,谢谢。
      • 注意:\wA-Za-z0-9_\w\d 的超集。
      • \w 很棒,因为它缩短了正则表达式,但问题是人们一直忘记 _ 和数字包括在内。它的含义虽然在语言之间通常是一致的,但可能会得到升级以匹配 Unicode 字符,例如在 .NET 正则表达式中。不过,我不反对使用它。
      猜你喜欢
      • 2012-04-17
      • 2013-12-20
      • 2014-03-19
      • 2011-07-05
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多