Tulis fungsi atau program untuk memvalidasi alamat email terhadap RFC 5321 (beberapa aturan tata bahasa ditemukan di 5322 ) dengan relaksasi yang dapat Anda abaikan komentar dan lipat spasi putih ( CFWS
) dan literal alamat umum. Ini memberi tata bahasa
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
Catatan: Saya telah melewatkan definisi IPv6-addr
karena RFC khusus ini salah dan tidak mengizinkan misalnya ::1
. Spesifikasi yang benar ada di RFC 2373 .
Batasan
Anda tidak boleh menggunakan panggilan pustaka validasi email yang ada. Namun, Anda dapat menggunakan perpustakaan jaringan yang ada untuk memeriksa alamat IP.
Jika Anda menulis fungsi / metode / operator / setara, ia harus mengambil string dan mengembalikan nilai boolean atau truey / falsy, yang sesuai untuk bahasa Anda. Jika Anda menulis sebuah program, ia harus mengambil satu baris dari stdin dan menunjukkan valid atau tidak valid melalui kode keluar.
Uji kasus
Kasing uji berikut tercantum dalam blok untuk kekompakan. Blok pertama adalah case yang harus dilewati:
[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]
Kasus uji berikut tidak boleh lulus:
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]
sumber
IPv6-addr
dibiarkan tidak terdefinisi, dan ada kasus uji yang memiliki alamat ipv6, apakah ada cara yang benar untuk memvalidasinya?[email protected]
dan[email protected]
gagal?Jawaban:
Python 3.3, 261
Python 3.3 diperlukan untuk modul ipaddress, yang digunakan untuk memvalidasi alamat IPv4 dan IPv6.
Versi yang kurang golf:
sumber
ALPHA
di augmented BNF dan char literals yang membangunQuoted-string
semua case-insensitive. dapatkah Anda mencukur beberapa karakter dengan menentukan case-insensitivity dan membuang salah satu rentang kelas char? btw, jika kamu merasa lincah, dapatkah kamu memberikan deskripsi singkat tentang bagaimana kamu mengembangkan ini?PHP 5.4.9, 495
Dan hanya untuk kepentingan lebih lanjut, inilah satu untuk tata bahasa RFC 5322 yang memungkinkan CFWS bersarang dan komponen lokal yang sudah usang:
(764)
Dan jika batas panjang bukan persyaratan:
RFC 5321 (414)
RFC 5322 (636)
sumber