我在這裏有RegEx,我需要知道它是否會100%省略任何不良的電子郵件地址,但我完全不瞭解它們,所以需要致電社區專家。任何人都可以向我詳細解釋這個正則表達式嗎?
的字符串如下:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$
預先感謝您!
我在這裏有RegEx,我需要知道它是否會100%省略任何不良的電子郵件地址,但我完全不瞭解它們,所以需要致電社區專家。任何人都可以向我詳細解釋這個正則表達式嗎?
的字符串如下:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$
預先感謝您!
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$
一塊一塊
^Start of the string
[_a-zA-Z0-9-]+ One or more characters of "_" (no quotes), a letter (a-z, A-Z), a number (0-9), or "-" (no quotes)
(.[_a-zA-Z0-9-]+)* zero or more substrings of type .something, or .123, or .a123. The substring must be formed by a . and a letter (same group of letters as before). So "." is not valid. ".a" or ".1" or ".-" is.
(到現在爲止它會接受例如my.name12
或my.name12.surname34
)
@ a "@" (like [email protected])
[a-zA-Z0-9-]+ One or more characters with the same pattern as before
(.[a-zA-Z0-9-]+)* Zero or more substrings of type ".something"... just as before
(.[a-zA-Z]{2,3}) A "." (dot) and 2 or 3 letters (a-z or A-Z)
$ The end of the string
所以我們有一個電子郵件地址,在那裏你可以沒有[email protected]
(在@
之前沒有「懸掛」點)或[email protected]
(沒有開始點)。域名必須以字母開頭,並且不能在第一級域名(.com
/.uk
/??)之前有一個點,因此沒有[email protected]
。一級域名必須有2或3個字母(無數字)
有一個錯誤,.
(點)必須轉義,所以它應該是\.
。根據不同的語言中,\
必須在一個字符串進行轉義(所以它可能是\\.
)
如果我正確地看到它,下面將根據你的正則表達式是有效的:[email protected]@[email protected]@aa
圓點爲任何標誌字符!
此外,以下有效電子郵件地址不會被接受,但它應該:
Someone%[email protected]
答案很簡單:不會。
除了不好的電子郵件地址並不一定意味着它的格式錯誤([email protected]格式正確但仍然不好),RegEx也會接受一些不良地址。
例如,最右邊的部分((.[a-zA-Z]{2,3})$
)指出已驗證的字符串應以點,然後是兩個或三個字母結尾。這將接受非現有的頂級域名(例如.aa),並會阻止四個字母頂級域名(例如.INFO)
[_a-zA-Z0-9-]
意味着你只需要這些字符(任何字母數字字符或「 - 」或「_」)在您的電子郵件地址,但它可以有效的與所有這些字符:! #$%&'* + -/=?^_`{| }〜
第一部分(@之前)最多可以有253個字符({1,253}),第二部分(可以在@之後)最多可以有64個字符max({4,64})。 (第一或第二組添加括號把({4,64})計數限制之前)
如果你想知道EmailAddress的規範,只要看看維基百科:The Article On Wiki
不,它不會排除100%的不良電子郵件地址。由於絕大多數語法有效地址都是針對不存在的帳戶(如[email protected]
),所以對於正則表達式來說,這是不可能完成的。
真正驗證電子郵件地址合法性的唯一方法是嘗試向其發送郵件 - 甚至只會告訴您郵件在該地址被接受,而不是由人類接收(如而不是被餵養到劇本或者被默默丟棄),即使它被人接收,你也不能保證它是聲稱擁有它的人。 (「您堅持要給我一個可交付的電子郵件地址?好的,我的電子郵件地址是[email protected]
」)
請不要嘗試使用正則表達式驗證電子郵件地址;這是一個不需要重新發明的輪子,除非你寫出一個可怕的毛茸茸的正則表達式,否則你將通過無效的電子郵件地址或拒絕有效的電子郵件地址。
CPAN上有很多模塊,比如Email::Valid,它們將全部爲您服務並經過測試。
簡單的例子:
use Email::Valid;
print (Email::Valid->address('[email protected]') ? 'yes' : 'no');
簡單得多,而且將只是工作。
另外,使用Mail::RFC822::Address:
if (Mail::RFC822::Address::valid('[email protected]')) { ...}
對於一個正則表達式將如何毛茸茸必須成功地處理所有符合RFC822-地址的例子,看看this beauty。
那些試圖手動進行自己的電子郵件地址驗證的人往往最終得到的代碼會讓語法無效的地址通過,甚至更糟的是拒絕完全有效的地址。
例如,有些人在他們的地址中使用+
,如[email protected]
--這被稱爲「地址標籤」或「子地址」。在驗證過程中,很多天真的嘗試都會拒絕,客戶最終會到別處去。
此外,過去有些人以前認爲頂級域總是2或3個字符;當例如, .info
已啓動,在這些域名地址的人將被告知他們完全有效的電子郵件地址是不可接受的。
最後,還有一些病理情況下,如"Mickey Mouse"@example.com
,[email protected][1.2.3.4]
這在語法上,有效的,但大多數人的手卷驗證會拒絕。
對於上述所有確定.
接受任何字符的作者,我發現在編寫對另一個RegEx問題的響應時,此編輯捕獲小部件會使用反斜槓。
(!這是一個問題)
好吧......讓我們正確地寫:
^\s*([_a-zA-Z0-9]+(\\.[_a-zA-Z0-9\\-\\%]+)\*)@([a-zA-Z0-9]+(\\.[a-zA-Z0-9\\-]+)\*(\\.[a-zA-Z]{2,4}))\s*$
這還採用了%
字符作爲允許-內在價值。這個套路的問題是,雖然它實際上做了很好的工作解析電子郵件地址,它也不是很有效的,因爲正則表達式是「貪婪」和終止條件(這是應該匹配像.com
和.edu
的東西)將衝過,那麼需要回溯,耗費大量的CPU時間。
真正的答案是使用特定於這一點,因爲其他海報建議的程序。但是如果你沒有CPAN模塊,或者目標環境沒有,那麼RegEx黑客可以接受。
您仍然會丟失本地部分的不少有效標點符號。而且你仍然要限制你作爲有效的頂級域名(TLD)匹配什麼,請參閱[.museum](http://index.museum/) – 2011-02-23 20:34:51
也許這正則表達式會做什麼?
^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$
從
http://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/
你是全職巫師嗎?大聲笑 – Yoda 2013-08-04 21:24:31
不,不是100%的服用。 – BoltClock 2011-02-23 11:31:25
你能給我比這更多的細節嗎? – Yoda 2011-02-23 11:36:35
雖然允許錯誤的電子郵件地址,它不會接受一個[RFC 3598(http://www.ietf.org/rfc/rfc3598.txt)的電子郵件地址,該地址是有效的。不要試圖重新發明輪子;有任務的CPAN模塊。 – Alessandro 2011-02-23 11:44:26