Существует ли реализация Java проверки входящей электронной почты в формате HTML?

Я хотел бы использовать новый <input type="email" /> элемент. Я хотел бы иметь Java-код, который реализует ту же проверку на сервере, что и в браузере.

Спецификация HTML5 определяет адреса электронной почты в 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

и:

atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
                       "!" / "#" /        ;  characters not including
                       "$" / "%" /        ;  specials.  Used for atoms.
                       "&" / "'" /
                       "*" / "+" /
                       "-" / "/" /
                       "=" / "?" /
                       "^" / "_" /
                       "`" / "{" /
                       "|" / "}" /
                       "~"

Это не те же правила, что и в RFC 5322. Как я могу проверить, что адрес соответствует этим правилам в Java?

Спасибо!

2 ответа

Решение

Вы можете использовать регулярное выражение:

 [A-Za-z0-9 #$%&'*+-/= ^_`!? {|}~]+@[A-Za-z0-9-]+([A-Za-Z0-. 9-]+)* 

На самом деле, приведенная вами рекомендация W3C предлагает регулярное выражение в качестве эквивалента того, что они представляют как 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/).

Это регулярное выражение принимает (все недействительно в адресе электронной почты, согласно Википедии):

  • "" (точка) в начале локальной части
  • "" (точка) в конце локальной части
  • несколько последовательных "." (точка) в локальной части
  • только номера в доменной части

и отклоняет (действует согласно Википедии):

  • Символы Юникода
  • некоторые специальные символы, разделенные кавычками (")

Обратите внимание, что W3C заявляет, что представляемая ими спецификация является преднамеренным нарушением RFC 5322, поэтому у них есть "оправдание" для исключения допустимых случаев, но ИМХО это не причина для принятия недействительных адресов.

Если вы не будете беспокоиться об этих исключительных случаях, вы можете использовать регулярное выражение, предложенное W3C. В противном случае вы должны использовать регулярное выражение, чтобы охватить случаи, которые вы хотите обработать.

Другие вопросы по тегам