我有一个regexp来验证这个^[\\w\\d_\\.]+@[[a-z]+\\.]*[a-z]{2,3}$
最后一部分 {2,3}
表示输入字符串末尾必须有2个或3个字符。但是对于下面显示的输入,它返回true。
String input = "person.name@domain.gov.ukzzz";
Pattern pattern = Pattern.compile("^[\\w\\d_\\.]+@[[a-z]+\\.]*[a-z]{2,3}$");
Matcher matcher = pattern.matcher(input);
System.out.println(input + " --> " + matcher.matches());
输出为person.name@domain.gov.ukzzz --> true
为什么吗
答案 0 :(得分:5)
因为[[a-z]+\\.]*
与您的案例中的domain.gov.ukz
匹配,所以这就是原因。顺便说一句,它也会匹配+++
,这是非法的。
请改为尝试:
"^[\\w\\d_\\.]+@([a-z]+\\.)+[a-z]{2,3}$"
但是:真正的电子邮件地址要比这个正则表达式复杂得多;我建议您使用javamail API及其InternetAddress
代替:它将为您解析,没有错误。例如,在你的正则表达式中,你没有考虑到主机名中的数字 legal 这一事实。 foo@4.pm
是有效的电子邮件地址。
答案 1 :(得分:1)
这是因为在字符串末尾有 2-3 a-z
个字符:zz
和zzz
都满足它。 [[a-z]+\\.]*
不是必需的(无论如何都应该在括号中)。我以为你希望它像:
([a-z]*\\.)
可能需要.
。