我想使用新的<input type="email" />
元素。我希望Java代码能够在浏览器中实现相同的验证。
ABNF:
1*( atext / "." ) "@" ldh-str *( "." ldh-str )
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>
<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case
<digit> ::= any one of the ten digits 0 through 9
and:
atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
这些不与RFC 5322中的规则相同。 如何在Java中测试地址是否符合这些规则?
谢谢!
答案 0 :(得分:6)
您可以使用正则表达式:
[A-Za-z0-9!#$%&'*+-/=?^_`{|}~]+@[A-Za-z0-9-]+(.[A-Za-z0-9-]+)*
答案 1 :(得分:1)
实际上,The W3C Recommendation you've cited提供了一个正则表达式作为它们作为定义有效电子邮件地址的ABNF所呈现的等价物:
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
但是这个正则表达式匹配无效的电子邮件地址,例如“.any..address。@ 123”(使用https://regex101.com/测试)。
此正则表达式接受(根据Wikipedia,电子邮件地址中的所有内容均无效):
并拒绝(根据维基百科有效):
"
)请注意,W3C声明他们提供的规范是willful violation RFC 5322,因此他们有“借口”来排除有效案例,但恕我直言,这不是接受无效地址的理由
如果您不打扰这些例外情况,可以使用W3C建议的正则表达式。否则,你应该使用正则表达式来覆盖你想要处理的案例。