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@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
Kasus uji berikut tidak boleh lulus:
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
dan ?????@domain.com
gagal?
IPv6-addr
dibiarkan tidak terdefinisi, dan ada kasus uji yang memiliki alamat ipv6, apakah ada cara yang benar untuk memvalidasinya?