Schreiben Sie eine Funktion oder ein Programm, um eine E-Mail-Adresse anhand von RFC 5321 (einige Grammatikregeln in 5322 ) zu validieren, mit der Entspannung, dass Sie Kommentare und gefaltete Leerzeichen ( CFWS
) und verallgemeinerte Adressliterale ignorieren können . Dies gibt die Grammatik
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
Hinweis: Ich habe die Definition von übersprungen, IPv6-addr
weil dieser bestimmte RFC es falsch macht und z ::1
. B. nicht zulässt . Die korrekte Spezifikation ist in RFC 2373 enthalten .
Beschränkungen
Sie dürfen keine vorhandenen Aufrufe der E-Mail-Validierungsbibliothek verwenden. Sie können jedoch vorhandene Netzwerkbibliotheken verwenden, um IP-Adressen zu überprüfen.
Wenn Sie eine Funktion / Methode / Operator / Äquivalent schreiben, sollte sie eine Zeichenfolge verwenden und je nach Sprache einen booleschen oder wahrheitsgemäßen / falschen Wert zurückgeben. Wenn Sie ein Programm schreiben, sollte es eine einzelne Zeile von stdin nehmen und über den Exit-Code gültig oder ungültig anzeigen.
Testfälle
Die folgenden Testfälle sind aus Gründen der Kompaktheit in Blöcken aufgeführt. Der erste Block sind Fälle, die bestehen sollten:
[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]
Die folgenden Testfälle sollten nicht bestanden werden:
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]
quelle
IPv6-addr
Gibt es eine korrekte Möglichkeit, diese zu validieren, da sie nicht definiert wurde und es Testfälle mit IPv6-Adressen gibt?[email protected]
und[email protected]
scheitern?Antworten:
Python 3.3, 261
Python 3.3 wird für das IP-Adressmodul benötigt, mit dem IPv4- und IPv6-Adressen überprüft werden.
Weniger Golfversion:
quelle
ALPHA
in erweitertem BNF und den Zeichenliteralen, die a konstruieren,Quoted-string
die Groß- und Kleinschreibung nicht berücksichtigt wird. Können Sie ein paar Zeichen rasieren, indem Sie die Groß- und Kleinschreibung nicht angeben und einen dieser Zeichenklassenbereiche fallen lassen? Übrigens, wenn Sie sich munter fühlen, können Sie kurz beschreiben, wie Sie dies entwickelt haben?PHP 5.4.9, 495
Und nur für weiteres Interesse, hier ist eine für die RFC 5322-Grammatik, die verschachtelte CFWS und veraltete lokale Teile ermöglicht:
(764)
Und wenn Längenbeschränkungen keine Voraussetzung sind:
RFC 5321 (414)
RFC 5322 (636)
quelle