0

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

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。

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

4

4 回答 4

16

您的正则表达式不允许符号-后出现,所以@

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

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

于 2013-04-30T08:27:19.393 回答
16

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

例如:

EmailValidator.getInstance().isValid(emailAddressString);
于 2013-04-30T09:33:42.820 回答
3

您可以使用许多正则表达式验证字符串。喜欢这里

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

阅读这篇 文章

于 2013-04-30T08:31:43.717 回答
2

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

\\是一个转义,告诉 Java 你不想使用破折号,因为它通常用于显示两个值之间的差异。所以像这样...

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

更新

蒂姆在评论中承认没有必要逃跑!

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

于 2013-04-30T08:28:49.487 回答