2017-02-27 75 views
-1
(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s|\s*,\s*|\s*$)) 

我有這樣的正則表達式這驗證電子郵件電子郵件驗證排放

我使用http://www.regextester.com/進行測試。所以,它的工作原理

[email protected]; [email protected]; [email protected]; [email protected], [email protected] 

但如果客戶端將寫

[email protected],[email protected] 

它說,這是假的。我怎樣才能做到這一點?

+1

這個正則表達式不應該像預期的那樣工作,因爲'-'必須在字面類的開頭或者結尾處進行字面匹配(你正在使用'[a-zA-Z0-9_-。] ')。你在哪裏找到這個正則表達式?它似乎允許IPv4域(這是有效的),但你真的需要它嗎?我很確定我們可以找到一個不太複雜的正則表達式,它仍然可以滿足您的需求。 – sp00m

+0

你的意思是*它說它是錯誤的*?它[適用於我](https://regex101.com/r/IgLQN3/1) –

+0

@ThomasAyoub它不適合你 - 在你的例子中匹配6是「'asjdas @ asc.com,asdas @ asd .com'「,並且沒有任何子匹配是有效的電子郵件地址。 –

回答

0

基本上,你需要做的是,他們前放置一個反斜槓(\)逃避所有的點(.)(爲你匹配一個字面點,不any character。所以,下面的正則表達式工作:

(([a-zA-Z0-9_\-\.]+)@(([[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)(\s*;\s|\s*,\s*|\s*$)) 

DEMO

0

像您期望的,這是不工作的原因是你沒有正確轉義域中捕獲.

默認情況下.表示「任何字符」,其中\.表示「句點字符」。

因爲它的立場[email protected],[email protected]是匹配爲:

  1. 任何東西到@(有一些注意事項 - [a-zA-Z0-9_-.]+確實應該[a-zA-Z0-9_\-\.]+或將衝到開始[-a-zA-Z0-9_\.]+所以它不被視爲一個範圍)。
  2. 的@
  3. 任何在z,AZ,0-9或破折號1次或多次,隨後任何字符,1次或更多次 - 這是逗號被拾取:([a-zA-Z0-9-]+.)+
  4. 任何在z ,AZ在2到4次之間。
  5. 空格或行尾。

因此,,和第二個@都推到那裏的3項。

不過,正如其他人所說,這是捕獲從字符串的郵件一個相當奇怪的正則表達式 - 並留下了許多有效的電子郵件從小組 - 例如頂級域名,現在可以是任意長度(.museum.aero是我碰到的兩個,有plentymore),而'現在在電子郵件地址的名字部分中很常見。

following regex將抓住所有的電子郵件地址,並不僅僅是電子郵件地址從字符串:

([a-zA-Z0-9_\-\.][email protected](?:(?:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})|(?:[a-zA-Z0-9\-]+\.+[a-zA-Z]{2,}))) 

這將忽略空格,處理一般和品牌頂級域名,並且還提供了基於IP的郵件有限的支持(例如[email protected]),但對於有效的電子郵件(即帶有撇號,加號等的郵件)和無效的IP(超過256的任何八位字節),它仍然會失敗。