2011-02-23 264 views
0

我在這裏有RegEx,我需要知道它是否會100%省略任何不良的電子郵件地址,但我完全不瞭解它們,所以需要致電社區專家。任何人都可以向我詳細解釋這個正則表達式嗎?

的字符串如下:

^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{2,3})$ 

預先感謝您!

+2

不,不是100%的服用。 – BoltClock 2011-02-23 11:31:25

+0

你能給我比這更多的細節嗎? – Yoda 2011-02-23 11:36:35

+5

雖然允許錯誤的電子郵件地址,它不會接受一個[RFC 3598(http://www.ietf.org/rfc/rfc3598.txt)的電子郵件地址,該地址是有效的。不要試圖重新發明輪子;有任務的CPAN模塊。 – Alessandro 2011-02-23 11:44:26

回答

8
^[_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.name12my.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個字母(無數字)

有一個錯誤,.(點)必須轉義,所以它應該是\.。根據不同的語言中,\必須在一個字符串進行轉義(所以它可能是\\.

+5

如果你想知道有多少「難」是決定什麼可以是一個正確的電子郵件地址:http://en.wikipedia.org/wiki/Email_address – xanatos 2011-02-23 11:44:28

+0

三江源,你非常詳細的解釋這段代碼給我。 +1 – Yoda 2011-02-23 12:58:11

+1

regexbuddy的輸出可能會有所幫助http://img62.imageshack.us/i/dpreciousregex.png/ – hpavc 2011-02-25 09:21:42

4

答案很簡單:不會。

除了不好的電子郵件地址並不一定意味着它的格式錯誤([email protected]格式正確但仍然不好),RegEx也會接受一些不良地址。

例如,最右邊的部分((.[a-zA-Z]{2,3})$)指出已驗證的字符串應以點,然後是兩個或三個字母結尾。這將接受非現有的頂級域名(例如.aa),並會阻止四個字母頂級域名(例如.INFO

2
  • 這個表達式將接受以下劃線開始電子郵件地址。這是(大部分)不可接受的。
  • 您對「用戶名」的大小(即「@」符號下面的部分)沒有設置任何最小限制。因此,單個字符的用戶名將繞過此。結合前面的例外情況,類型爲[email protected]的email-id可能未被檢測到。
  • The。 (點)運算符接受任何字符。因此,在「@」部分之後,@@。com等類型的(無效)域可能未被檢測到。
  • 只接受2或3個字符的域名將被忽略。
+2

以下劃線開頭的電子郵件地址有什麼問題? – CanSpice 2011-02-24 00:33:17

+0

擁有單個字符用戶名有什麼不對? – dolmen 2011-02-24 21:32:19

2
[_a-zA-Z0-9-] 

意味着你只需要這些字符(任何字母數字字符或「 - 」或「_」)在您的電子郵件地址,但它可以有效的與所有這些字符:! #$%&'* + -/=?^_`{| }〜

第一部分(@之前)最多可以有253個字符({1,253}),第二部分(可以在@之後)最多可以有64個字符max({4,64})。 (第一或第二組添加括號把({4,64})計數限制之前)

如果你想知道EmailAddress的規範,只要看看維基百科:The Article On Wiki

2

不,它不會排除100%的不良電子郵件地址。由於絕大多數語法有效地址都是針對不存在的帳戶(如[email protected]),所以對於正則表達式來說,這是不可能完成的。

真正驗證電子郵件地址合法性的唯一方法是嘗試向其發送郵件 - 甚至只會告訴您郵件在該地址被接受,而不是由人類接收(如而不是被餵養到劇本或者被默默丟棄),即使它被人接收,你也不能保證它是聲稱擁有它的人。 (「您堅持要給我一個可交付的電子郵件地址?好的,我的電子郵件地址是[email protected]」)

16

請不要嘗試使用正則表達式驗證電子郵件地址;這是一個不需要重新發明的輪子,除非你寫出一個可怕的毛茸茸的正則表達式,否則你將通過無效的電子郵件地址或拒絕有效的電子郵件地址。

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]這在語法上,有效的,但大多數人的手卷驗證會拒絕。

+2

如果可以的話,一百個讚揚! – dsolimano 2011-02-23 15:22:28

+0

跳到它所屬的頂部。 – daxim 2011-02-23 17:45:06

+0

始終有一個看看RT錯誤隊列使用或推薦一個模塊:郵件:: RFC822 ::地址接受太多的字符串https://rt.cpan.org/Ticket/Display.html?id=61288 – dolmen 2011-02-24 21:23:38

-2

對於上述所有確定.接受任何字符的作者,我發現在編寫對另一個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黑客可以接受。

+1

您仍然會丟失本地部分的不少有效標點符號。而且你仍然要限制你作爲有效的頂級域名(TLD)匹配什麼,請參閱[.museum](http://index.museum/) – 2011-02-23 20:34:51

相關問題