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

我有一个电子邮件地址validation正则表达式我在代码中使用如下:

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之间的连字符,因为当我删除它时,Boolean返回true。

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

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

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

会“修复”这个具体问题。 但电子邮件地址比这复杂得多。 使用正则表达式validation它们并不是一个好主意。 查看@DuncanJones的评论。

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

例如:

 EmailValidator.getInstance().isValid(emailAddressString); 

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

但是最佳解决方案真的是必须的吗? 不需要你只有次优解决方案,涵盖99.9999%使用的地址?

阅读这篇文章

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

\\是一个逃避告诉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_]所以你不必一遍又一遍地写这些。 最后熟悉这个网站 。 一旦你开始使用正则表达式,这是一个很大的帮助。