2014-01-17 57 views
0

我試圖驗證使用下面的正則表達式驗證UTF8字符基於電子郵件

Regex.IsMatch(emailAddress, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.CultureInvariant);

它爲 「ä[email protected]」 返回false電子郵件(UTF8)。

有關如何改善它的任何建議。

+1

請參閱http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address – StevieB

+2

使用正則表達式的電子郵件驗證比看起來更復雜:http:// stackoverflow .com/a/201378/1283847 – Leri

+0

@StevieB謝謝我已經通過鏈接。但我認爲將選項設置爲「RegexOptions.CultureInvariant」並在正則表達式中指定「\ w」將驗證所有UTF8單詞。 – user3205838

回答

0
  1. UTF-8與此無關,你正在驗證一個字符串,而不是一個特定的編碼。

  2. 您的正則表達式實際上對[email protected]"返回true(帶或不帶CultureInvariant選項)。嘗試Console.Write(Regex.IsMatch("ä[email protected]", @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.CultureInvariant));自己,你會得到true

  3. 您將失敗的所有國際化域名,如[email protected]ουτοπία.δπθ.gr,如果你關心非ASCiI限制的電子郵件地址,你可能想包括他們。 (如果你想排除禁止混淆的話,你會變得非常複雜)。

有其他人使用正則表達式驗證電子郵件陳述的問題,但它們歸結爲:

  1. 實際電子郵件語法是比較複雜的比人們想象的(我們處理甚至在與非ASCII擴展)。例如你知道Abc\@[email protected]是一個有效的電子郵件地址嗎?實際上,它是RFC 3696中給出的有效地址的一個例子。

  2. 如果你努力構建一個完美的驗證器(這是可能的),這將是一種浪費。機會是你的電子郵件軟件不會處理所有的(例如上面的Abc\@[email protected]將無法​​使用大量的軟件),那麼很多有效的電子郵件地址實際上是不正確的。

但無論如何,我得到true運行你的代碼,錯誤在別處。

+0

感謝您指出我正確的方向我收到不正確的電子郵件字符串由於編碼問題。 – user3205838

0

簡單的答案是,你不想這樣做:正則表達式是驗證電子郵件地址的一種可怕的方式。

對於您的具體問題的答案是,如果您願意阻止有效地址並允許無效地址,則您希望使用[\p{L}\p{M}\p{N}]而不是\w來匹配地址的用戶名部分中的Unicode字符字符。

+0

爲什麼你認爲正則表達式是驗證電子郵件地址的可怕方式?你有什麼更好的解決方案? –

+0

電子郵件地址的完整法律語法使得一個令人難以置信的複雜正則表達式(我見過的最簡單的符合RFC-822的正則表達式是一頁半長)。如果你想檢查一個地址是否有效,只需發送一封電子郵件,看看它是否反彈。 – Mark

+0

狀態機可以更好地適應這個任務。當然,這一點比較冗長。 – StevieB