我的正则表达式有什么问题{2,3}

时间:2014-02-21 15:25:23

标签: java regex

我有一个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

为什么吗

2 个答案:

答案 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个字符:zzzzz都满足它。 [[a-z]+\\.]*不是必需的(无论如何都应该在括号中)。我以为你希望它像:

([a-z]*\\.)

可能需要.