2009-08-12 81 views
1

可能重複:
What is the best regular expression for validating email addresses?普通電子郵件表達

我使用檢查電子郵件這個特殊的正則表達式。

"^[A-Za-z0-9](([a-zA-Z0-9,=\.!\-#|\$%\^&\*\+/\?_`\{\}~]+)*)@(?:[0-9a-zA-Z-]+\.)+[a-zA-Z]{2,9}$" 

我的問題是,這允許「@」符號之前的時間段。 有沒有什麼方法可以修改這個表達式,這樣就不會發生這種情況,但所有其他條件都得到了保持。

一個。@ b.com應爲無效

在此先感謝 -Rollin

+3

(1)電子郵件地址正則表達式的主題已經被討論了數十億次,以及(2)什麼讓你認爲是「。」。在「@」不合法之前? – 2009-08-12 01:57:09

+1

你總是可以使用官方RFC822正則表達式:http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html – ceejayoz 2009-08-12 01:58:13

+2

@Andrew:其一,RFC 5322說了「」在「@」不合法之前...... http://en.wikipedia.org/wiki/E-mail_address – 2009-08-12 02:02:14

回答

1

你可以把[^\.]@之前,所以,它將使除了點

當然這可能不是你想要的任何角色,所以你可以只把任何法律字符[]在它

以防萬一有人有一個電子郵件名稱(我指的是@前面的部分),這只是1個字符,則可能需要如果你在Perl這樣做是爲了發揮創意與|

+0

簡單但鮮明的想法! 這就是我想出來的......我認爲這應該工作。 ^([A-ZA-Z0-9] | [A-ZA-Z0-9](([A-ZA-Z0-9,= \ \ - #|!\ $%\ ^&\ * \ ?+/\ _'\ {\}〜] +)*)[A-ZA-Z0-9,= \ - #|!\ $%\ ^&\ * \ +/\ _'\ {\}? 〜])@(?:[0-9A-ZA-Z - ] + \)+ [A-ZA-Z] {2,9} $ PS:進行此短有什麼想法? – AgentHunt 2009-08-12 03:22:53

7

best answer到目前爲止,我已經看到了。老實說,如果你給出了你使用哪種語言或工具集的一些說明,我會告訴你爲你做這件事的圖書館,而不是告訴你如何手動推出一個正則表達式。

編輯:提供的補充資料,這是在.NET中,我會使用MailAddress類,並完全放棄使用正則表達式的想法,像這樣:

public bool IsAddressValid(string text) 
{ 
    try 
    { 
     MailAddress address = new MailAddress(text); 
     return true; 
    } 
    catch (FormatException) 
    { 
     return false; 
    } 
} 

如果在有額外的要求並且高於驗證地址本身(例如確保它來自特定的一組域或某些類型),那麼在驗證地址有效後,您可以通過更簡單的測試來做到這一點,因爲我suggested in another post

+0

我使用的是asp.net(VB.net)正則表達式驗證器。由於我被要求加入一些特定的要求,我需要手卷一個表達式。這就是我無法使用在線可用的許多正則表達式之一的原因。 – AgentHunt 2009-08-12 02:09:26

+0

@unknown李說「圖書館」不是「正則表達式」。如果你閱讀Lee發佈的鏈接,你會發現他推薦使用任何正則表達式來反對*,因爲這樣做本質上是不正確的。 – Imagist 2009-08-12 02:25:43

0

如果您的正則表達式引擎有向後看斷言,那麼您可以在「@」之前添加「(?<!\。)」。

+0

我在asp.net中使用正則表達式驗證器。這會在那裏工作嗎? – AgentHunt 2009-08-12 02:07:38

+0

當你嘗試它時它工作嗎? – Imagist 2009-08-12 02:26:17

0

- 下面的腳本是一個例子

my $string = '[email protected]'; 
if($string =~/(\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,9})/) 
{ 
    print "gotcha!"; 
} 
else 
{ 
    print "nope :("; 
} 

正如您所見,Perl正則表達式字符\ w優雅地處理句點。如果將$ string更改爲「name。@ domain.com」,則會失敗。

+0

ahhh - 在我寫這篇文章的時候,大概有五個好的答案:) – dls 2009-08-12 02:09:47

3

一個奇怪的遊戲。唯一的勝利舉動 是不玩。

說真的,用正則表達式驗證電子郵件地址的唯一方法是不用正則表達式驗證電子郵件地址。接受電子郵件地址的語法不正常。確實,現代正則表達式可以支持一些非規則語法,但即便如此,爲這樣一個複雜語法維護一個正則表達式(如你所見)幾乎是不可能的。

唯一合理的使用與我能想到的電子郵件地址的正則表達式是做客戶端上的一些最起碼的檢查(是否包含@符號?)。

應該做的是什麼:

  1. 發送電子郵件的電子郵件地址與一個鏈接,用戶點擊。如果用戶點擊該鏈接,則該電子郵件地址是有效的。此外,它存在,並且用戶可能是在您的表單中輸入電子郵件地址的人。這不僅100%驗證了電子郵件地址,還爲您提供了更多保證。

  2. 如果你不能做到1,使用預包裝的電子郵件驗證。更好,同時使用1和2

  3. 如果你不能做到1或2,寫一個真正的解析器來驗證電子郵件地址。