是否有HTML5输入电子邮件验证的Java实现?

时间:2011-02-09 00:21:28

标签: java html5 input validation email-validation

我想使用新的<input type="email" />元素。我希望Java代码能够在浏览器中实现相同的验证。

The HTML5 spec defines email addresses中的

ABNF

1*( atext / "." ) "@" ldh-str *( "." ldh-str )

where

<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中测试地址是否符合这些规则?

谢谢!

2 个答案:

答案 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,电子邮件地址中的所有内容均无效):

  • “”。 (点)在本地部分的开头
  • “”。 (点)在本地部分的末尾
  • 多个连续“。” (点)在本地部分
  • 仅限域名部分中的数字

并拒绝(根据维基百科有效):

  • Unicode字符
  • 使用引号"
  • 分隔的一些特殊字符

请注意,W3C声明他们提供的规范是willful violation RFC 5322,因此他们有“借口”来排除有效案例,但恕我直言,这不是接受无效地址的理由

如果您不打扰这些例外情况,可以使用W3C建议的正则表达式。否则,你应该使用正则表达式来覆盖你想要处理的案例。