Escreva uma função ou programa para validar um endereço de email no RFC 5321 (algumas regras gramaticais encontradas no 5322 ) com o relaxamento que você pode ignorar comentários e dobrar espaços em branco ( CFWS
) e literais de endereço generalizados. Isso fornece a gramática
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
Nota: Eu pulei a definição de IPv6-addr
porque esta RFC específica erra e desaprova, por exemplo ::1
. A especificação correta está na RFC 2373 .
Restrições
Você não pode usar nenhuma chamada existente da biblioteca de validação de email. No entanto, você pode usar as bibliotecas de rede existentes para verificar os endereços IP.
Se você escrever uma função / método / operador / equivalente, ela deve pegar uma string e retornar um valor booleano ou verdade / falso, conforme apropriado para o seu idioma. Se você escrever um programa, ele deve usar uma única linha do stdin e indicar válido ou inválido através do código de saída.
Casos de teste
Os seguintes casos de teste estão listados em blocos para compactação. O primeiro bloco são casos que devem passar:
[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]
Os seguintes casos de teste não devem passar:
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]
fonte
IPv6-addr
foi deixado indefinido e há casos de teste com endereços IPv6, existe uma maneira correta de validá-los?[email protected]
e[email protected]
falhar?Respostas:
Python 3.3, 261
O Python 3.3 é necessário para o módulo ipaddress, usado para validar endereços IPv4 e IPv6.
Versão menos golfe:
fonte
ALPHA
no BNF aumentado e os literais de caracteres que constroem aQuoted-string
não diferenciam maiúsculas de minúsculas. você pode raspar alguns caracteres especificando a distinção entre maiúsculas e minúsculas e abandonando um desses intervalos de classe de caracteres? btw, se você estiver se sentindo brincalhão, pode dar uma breve descrição de como você desenvolveu isso?PHP 5.4.9, 495
E apenas para mais interesse, aqui está uma gramática RFC 5322 que permite CFWS aninhados e peças locais obsoletas:
(764)
E se os limites de comprimento não forem um requisito:
RFC 5321 (414)
RFC 5322 (636)
fonte