2012-07-12 96 views
2

任何人都知道一個正則表達式,它只會匹配包含子域的郵件嗎?電子郵件子域匹配的正則表達式

例如,

[email protected][email protected]

優選地在使用。

我嘗試這樣:

^[-+.0-9A-Z_a-z][email protected][-+.0-9A-Z_a-z]+\.[A-Za-z]{2,4}$ 

,但它也符合[email protected]

+0

'^ [+ 0-9A-Z_a-Z] + @ + [A -Za-z] +。{2,4} $'試試這個。 – Prateek 2012-07-12 11:04:45

+0

不匹配任何東西,我試過這個:email〜'(\ w + \。?)+ @(\ w + \。){2,} \ w {2,4}' 但是在postgresql中,它運作的是紅色的。有任何想法嗎? – user1009698 2012-07-12 11:18:31

+0

如果你指定了意圖是什麼 - 它會幫助你達到目的。最好的答案很大程度上取決於你使用的是什麼;特別是報告與驗證與數據清理是完全不同的任務。 – 2012-07-12 14:17:37

回答

0

如果所有頂級域名及其結構都需要列表。 Mozilla項目有這樣一個列表;它有幾百行,所以將它併入到正則表達式可能會很麻煩,儘管當然不是不可能的。 https://wiki.mozilla.org/TLD_List更新:被代替http://publicsuffix.org/

基本上它是一個鏈接解析器。它需要在文本文件(從數據庫)來查找,找到匹配的電子郵件地址或URL任何文本,並把它們轉化爲鏈接

+0

如何得到一個好的粗略列表? – user1009698 2012-07-12 10:56:09

1

使用這一個:

(\[email protected][\w.]+\w) 

解釋:

\w+  word characters (a-z, A-Z, 0-9, _) 
     (1 or more times (matching the most amount possible)) 

@      '@' 

[\w.]+ any character of: word characters (a-z, A-Z, 0-9, _), '.' 
     (1 or more times (matching the most amount possible)) 

\w  word characters (a-z, A-Z, 0-9, _) 

PostgreSql參見this linkthis。 (似乎是不可能的)。

+0

和postgresql:email〜'(\ w + @ [\ w。] + \ w)' ? 看起來沒有工作 – user1009698 2012-07-12 12:14:27

+0

這個正則表達式在PostgreSQL中根本不起作用。 – 2012-07-12 23:00:42

+0

是的,流動我的答案鏈接。 – Ria 2012-07-13 07:18:39

7

不要,不管用於驗證目的。它只會以痛苦結束。

驗證電子郵件地址的唯一合理正則表達式是查找「@」符號和至少一個句點的表達式。沒有其他的;隨着IDNs的到來,甚至字母數字也是毫無意義的。

至少您需要準確定義「子域」的含義。一切都是一個子域。什麼是子域?什麼被排除在外,包括什麼?

你如何定義「子域」與「頂級」?你的意思是「a domain that is open to public registration的子域名」? 「開放給公衆註冊的域的子域的子域」?在什麼級別的授權下,它會成爲您的目的的子域名?

政府領域,哪些可以註冊域名的「公共」非常有限,子域名的子域名是否是常態呢?你想匹配什麼?

您將如何應對new gTLDs以及列表會隨時間變化的事實?或者增加/刪除ccTLD?如果ccTLD改變其政策,開始出售直接後代域名(例如「myname.au」)而不是僅出售特定的子註冊管理機構(例如「myname.org.au」),那麼呢?你會動態地更新你的正則表達式嗎?如果是的話,你將如何處理曾經有效且不再使用的地址,反之亦然?

我遇到了白癡郵件驗證系統,甚至拒絕我的主要電子郵件地址[email protected]。au(儘管它已經遍佈了'net'),儘管它是一個完全有效的.id.au域名,但它沒有任何意義。

請不要創建另一個。如果你的意圖不是驗證,那很酷,但不要試圖用正則表達式驗證電子郵件地址域。

+0

用於教學的味道+1(感覺有什麼不對,什麼不是) – 2012-07-12 14:58:30

1

我認爲你可以自己做,試圖在網站上:

正則表達式測試儀http://regexpal.com/

你可以嘗試網上...

問候,
維克多蘇里塔M.

+0

方便的工具,但並非所有的正則表達式方言是相同的或支持相同的東西,所以這是相當有限的效用。它甚至不允許你在pcre,擴展posix正則表達式和posix正則表達式之間切換。 – 2012-07-12 23:31:37

2

這個簡單的正則表達式並不能保證有效的電子郵件地址,但它可靠地消除了大部分無意義的事情:如果表達式產生FALSE,則地址被激活盟友無效:

SELECT '[email protected]' ~ E'^\\[email protected]\\.\\S{2,}+$' 
^ .. start of string 
\S+ .. one or more non-space characters 
@subdomain .. literally 
\. .. a literal dot 
\S{2,}+ two or more non-space characters 
$ .. end of string 

所有\一倍escape string syntax
而且,與其他答案不同,它在PostgreSQL中起作用。經測試與v9.1.4。手冊中的細節here

贊@Craig寫道:嘗試可靠的驗證是徒勞的。但你仍然可以消除許多廢話。

一步,消除多@: - [ - + 0-9A-Z_a-Z]。

E'^[^[:space:]@][email protected]\\.[^[:space:]@]{2,}+$' 
相關問題