如何使用撇号验证电子邮件并使用正则表达式限制@符号后面的点数。 (JAVA)

时间:2015-11-19 13:37:19

标签: java regex validation

是的,有人能帮帮我吗?我对regEx不是很熟悉,我正在尝试验证电子邮件地址。 我有的regEx和代码是:

public class TestRegExEmail {

public static void main(final String[] args) {

    // List of valid URLs
    List<String> validValues = new ArrayList<>();
    validValues.add("wiliam@hotmail.com");
    validValues.add("wiliam.ferraciolli@hotmail.com");
    validValues.add("wiliam@hotmail.co.uk");
    validValues.add("wiliam.ferraciolli@hotmail.co.uk");
    validValues.add("wiliam_ferraciolli@hotmail.co.uk");
    validValues.add("wiliam'ferraciolli@hotmail.co.uk");
    validValues.add("wiliam334-1@mydomain.co.uk.me");

    // List on invalid URLs
    List<String> invalidValues = new ArrayList<>();
    invalidValues.add("wiliam.ferraciolli@hotmail.com.dodge.too.many");
    invalidValues.add("hwiliam@hotmail.com.otherdomain.uk.dodge");
    invalidValues.add("wiliam.ferraciolli@hotmail.com.com.com.com");
    invalidValues.add("wiliam.hotmail.com");
    invalidValues.add("wiliam..ferraciolli@hotmail.com");
    invalidValues.add("wiliam%ferraciolli.@hotmail.com");
    invalidValues.add("wiliam$ferraciolli.@hotmail.com"); 
    invalidValues.add("wiliam/ferraciolli.@hotmail.com");         

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

    Pattern pattern = Pattern.compile(regex);

    // print valid emails
    for (String s : validValues) {
        Matcher matcher = pattern.matcher(s);
        System.out.println(s + " // " + matcher.matches());
    }

    System.out.println();
    // print invalid emails
    for (String s : invalidValues) {
        Matcher matcher = pattern.matcher(s);
        System.out.println(s + " // " + matcher.matches());
    }

}

}

此regEx工作正常,但在带有撇号的电子邮件中失败。另一个问题是在@符号后只允许3个点是理想的。 任何建议将不胜感激。

此致

1 个答案:

答案 0 :(得分:1)

  

此regEx工作正常,但在带有撇号的电子邮件中失败。

     
    

关注@Am_I_Helpful评论并找到了一个很好的解决方案。 "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[‌​a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"

  

确切地说,您需要在character class中包含所有允许的字符:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+
       \_________________/
     non-alphanumerics allowed

我还会使用^$将您的模式锚定到字符串的开头和结尾,就像您之前的版本一样。

  

另一个问题是在@符号后只允许3个点是理想的。

@之后的每个点重复一次来自正则表达式的non-capturing group

@(?:[a-z0-9](?:[‌​a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
            \                      \_/ /
             \           literal dots /
              \______________________/
             repeated once for each dot

但您使用+ quantifier至少重复一次,但可以匹配多次。相反,请使用{1,3} quantifier限制重复。

@(?:[a-z0-9](?:[‌​a-z0-9-]*[a-z0-9])?\\.){1,3}[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
                                       ^^^^^

<强>正则表达式

"^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[‌​a-z0-9-]*[a-z0-9])?\\.){1,3}[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"

regex101 demo