Napisz funkcję lub program do sprawdzania poprawności adresu e-mail w stosunku do RFC 5321 (niektóre reguły gramatyczne znalezione w 5322 ) ze swobodą, że możesz ignorować komentarze i składać białe znaki ( CFWS
) i ogólne literały adresowe. To daje gramatykę
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
Uwaga: Pominąłem definicję, IPv6-addr
ponieważ ten konkretny RFC źle go rozumie i nie pozwala np ::1
. Prawidłowa specyfikacja znajduje się w RFC 2373 .
Ograniczenia
Nie można używać żadnych istniejących wywołań biblioteki sprawdzania poprawności wiadomości e-mail. Możesz jednak użyć istniejących bibliotek sieciowych do sprawdzenia adresów IP.
Jeśli napiszesz funkcję / metodę / operatora / równoważnik, powinna ona pobrać ciąg znaków i zwrócić wartość logiczną lub wartość prawda / fałsz, odpowiednio do twojego języka. Jeśli piszesz program, powinien on pobierać jedną linię ze standardowego wejścia i wskazywać prawidłowy lub nieprawidłowy za pomocą kodu wyjścia.
Przypadki testowe
Poniższe przypadki testowe są wymienione w blokach dla zwięzłości. Pierwszy blok to przypadki, które powinny przejść:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
email@[123.123.123.123]
"email"@domain.com
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
""@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/[email protected]
[email protected]
!def!xyz%[email protected]
[email protected]
_somename@[IPv6:::1]
[email protected]
[email protected]
[email protected]
Następujące przypadki testowe nie powinny przejść pomyślnie:
plainaddress
#@%^%#$@#$@#.com
@domain.com
Joe Smith <[email protected]>
email.domain.com
email@[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected] (Joe Smith)
[email protected]
[email protected]
email@[IPv6:127.0.0.1]
email@[127.0.0]
email@[.127.0.0.1]
email@[127.0.0.1.]
email@IPv6:::1]
[email protected]]
email@[256.123.123.123]
źródło
IPv6-addr
nie został zdefiniowany, a istnieją przypadki testowe, które mają adresy IPv6, czy istnieje właściwy sposób na ich sprawdzenie?[email protected]
i[email protected]
zawieść?Odpowiedzi:
Python 3.3, 261
Python 3.3 jest potrzebny do modułu ipaddress, który służy do sprawdzania poprawności adresów IPv4 i IPv6.
Wersja mniej golfowa:
źródło
ALPHA
w rozszerzonym BNF, a literał char konstruujący aQuoted-string
nie uwzględnia wielkości liter. czy możesz ogolić kilka znaków, określając rozróżnianie wielkości liter i porzucając jeden z tych zakresów klas char? btw, jeśli czujesz się rozbrykany, czy możesz krótko opisać, jak to rozwinęłeś?PHP 5.4.9, 495
I dla dalszego zainteresowania, oto jedna dla gramatyki RFC 5322, która pozwala na zagnieżdżone CFWS i przestarzałe części lokalne:
(764)
A jeśli ograniczenia długości nie są wymagane:
RFC 5321 (414)
RFC 5322 (636)
źródło