繁体   English   中英

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

[英]How to email validate with apostrophe and limit the number of dots after the @ symbol using Regular expression. (JAVA)

有人能帮助我吗? 我对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个点是理想的。 任何建议,将不胜感激。

问候

此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])?"

确实,您需要在字符类中包括所有允许的字符

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

我也将您的模式锚定在他的字符串的开头和结尾,分别使用^$就像您在先前版本中一样。


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

对于@之后的每个圆点,此正则表达式中的非捕获组重复一次:

@(?:[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

但是,您正在使用+ 量词重复至少一次,但要重复多次。 而是使用{1,3} 量词限制重复。

@(?:[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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM