当域名具有连字符时,电子邮件地址验证将失败

时间:2013-04-30 08:24:32

标签: java regex validation email

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

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 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:16)

我建议你不要试图自己解决这个问题。相反,请依赖经过良好测试的解决方案,例如来自EmailValidatorcommons-validator

例如:

EmailValidator.getInstance().isValid(emailAddressString);

答案 2 :(得分:3)

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

一样

但是,获得最佳解决方案真的很有必要吗?您是否只需要覆盖99.9999%已使用地址的次优解决方案?

读这个 article

答案 3 :(得分: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_],这样您就不必一遍又一遍地写这些内容。最后熟悉this site。一旦你开始使用正则表达式,这是一个很好的帮助。