Напишіть функцію або програму для перевірки адреси електронної пошти щодо RFC 5321 (деякі граматичні правила, знайдені в 5322 ), з послабленням того, що ви можете ігнорувати коментарі та складні пробіли ( CFWS) та узагальнені літеральні адреси. Це дає граматику
Mailbox = Local-part "@" ( Domain / address-literal )
Local-part = Dot-string / Quoted-string
Dot-string = Atom *("." Atom)
Atom = 1*atext
atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
Quoted-string = DQUOTE *QcontentSMTP DQUOTE
QcontentSMTP = qtextSMTP / quoted-pairSMTP
qtextSMTP = %d32-33 / %d35-91 / %d93-126
quoted-pairSMTP = %d92 %d32-126
Domain = sub-domain *("." sub-domain)
sub-domain = Let-dig [Ldh-str]
Let-dig = ALPHA / DIGIT
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
address-literal = "[" ( IPv4-address-literal / IPv6-address-literal ) "]"
IPv4-address-literal = Snum 3("." Snum)
IPv6-address-literal = "IPv6:" IPv6-addr
Snum = 1*3DIGIT
; representing a decimal integer value in the range 0 through 255
Примітка. Я пропустив визначення, IPv6-addrоскільки саме цей RFC помиляється і забороняється, наприклад ::1. Правильна специфікація є у RFC 2373 .
Обмеження
Ви не можете використовувати будь-які існуючі дзвінки з бібліотеки перевірки електронної пошти. Однак ви можете використовувати наявні мережеві бібліотеки для перевірки IP-адрес.
Якщо ви пишете функцію / метод / оператор / еквівалент, вона повинна взяти рядок і повернути булеве або truthy / фальшиве значення, відповідно до вашої мови. Якщо ви пишете програму, вона повинна взяти один рядок від stdin та вказати дійсний чи недійсний через вихідний код.
Тестові справи
Наступні тестові приклади наведені в блоках для компактності. Перший блок - це випадки, які повинні пройти:
email@domain.com
e@domain.com
firstname.lastname@domain.com
email@subdomain.domain.com
firstname+lastname@domain.com
email@123.123.123.123
email@[123.123.123.123]
"email"@domain.com
1234567890@domain.com
email@domain-one.com
_______@domain.com
email@domain.name
email@domain.co.jp
firstname-lastname@domain.com
""@domain.com
"e"@domain.com
"\@"@domain.com
email@domain
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@example.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
_somename@[IPv6:::1]
fred+bloggs@abc.museum
email@d.com
?????@domain.com
Наступні тестові випадки не повинні проходити:
plainaddress
#@%^%#$@#$@#.com
@domain.com
Joe Smith <email@domain.com>
email.domain.com
email@domain@domain.com
.email@domain.com
email.@domain.com
email.email.@domain.com
email..email@domain.com
email@domain.com (Joe Smith)
email@-domain.com
email@domain..com
email@[IPv6:127.0.0.1]
email@[127.0.0]
email@[.127.0.0.1]
email@[127.0.0.1.]
email@IPv6:::1]
_somename@domain.com]
email@[256.123.123.123]
email@d.comі ?????@domain.comне вдається?
IPv6-addrвін не визначений, і є тестові випадки з адресами ipv6, чи є правильний спосіб їх перевірки?