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个点是理想的。 任何建议将不胜感激。
此致
答案 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])?$"