Écrivez une fonction ou un programme pour valider une adresse e-mail par rapport à la RFC 5321 (certaines règles de grammaire trouvées dans 5322 ) avec la relaxation que vous pouvez ignorer les commentaires et le pliage des espaces ( CFWS
) et des littéraux d'adresse généralisés. Cela donne la grammaire
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
Remarque: J'ai ignoré la définition de IPv6-addr
parce que ce RFC particulier se trompe et interdit par exemple ::1
. La spécification correcte se trouve dans la RFC 2373 .
Restrictions
Vous ne pouvez pas utiliser d'appels de bibliothèque de validation de courrier électronique existants. Cependant, vous pouvez utiliser les bibliothèques réseau existantes pour vérifier les adresses IP.
Si vous écrivez une fonction / méthode / opérateur / équivalent, elle doit prendre une chaîne et renvoyer une valeur booléenne ou véridique / fausse, selon votre langue. Si vous écrivez un programme, il doit prendre une seule ligne de stdin et indiquer valide ou invalide via le code de sortie.
Cas de test
Les cas de test suivants sont répertoriés dans des blocs pour plus de compacité. Le premier bloc sont des cas qui devraient passer:
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
Les cas de test suivants ne doivent pas réussir:
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
et ?????@domain.com
échouer?
IPv6-addr
a été laissé indéfini, et il existe des cas de test qui ont des adresses ipv6, existe-t-il un moyen correct de les valider?