2015-05-29 68 views
0

我正在嘗試使RegEx可以匹配電子郵件地址的域部分。現在我必須使用其中的兩個,一個可以獲取所有電子郵件地址,另一個可以匹配域名,但我仍然遇到問題。用於匹配電子郵件的域部分的最佳正則表達式

現在我的代碼是這樣的:

var email_ex = /[a-zA-Z0-9]+(?:(\.|_)[A-Za-z0-9!#$%&'*+/=?^`{|}~-]+)*@(?!([a-zA-Z0-9]*\.[a-zA-Z0-9]*\.[a-zA-Z0-9]*\.))(?:[A-Za-z0-9](?:[a-zA-Z0-9-]*[A-Za-z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?/ig; // Match all email addresses on page 
    email_ex = new RegExp(email_ex); 

    var domain_ex = /[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU|CO\.UK|AU|LI|LY|IT|IO)/ig // Match all domains 
    domain_ex = new RegExp(domain_ex); 

    var match = document.body.innerText; // Location to pull our text from. In this case it's the whole body 
    match = match.match(email_ex); // Run the RegExp on the body's textContent 

我寧願不必須有頂級域名的列表,但我一直沒能找到足夠好的

+2

這是用於驗證,還是隻是想用它來獲取域的一部分? 此外,現在有一大堆新TLD可用,因此與它們匹配不會有所幫助:http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains – nils

+0

作爲旁註,使用「i」標誌,您不需要指定不同的情況(即'com'和'COM'將匹配相同的東西,所以你可以將它們作爲重複刪除) –

+0

我建議你決定什麼符合**有效** TLD *格式*。即六個字符與可選的兩個字符的國家,等。 [這個鏈接](http://www.regular-expressions.info/email.html)有很好的信息來決定這些事情,遠遠超過應該留在這裏。 –

回答

4

表達最簡單的RegExp:/@([^\s]*)/

var email = "[email protected]e.domain"; 
var domain = email.match(/@([^\s]*)/)[1]; 
0

我同意您不應該有一個TLD列表。您的正則表達式已經錯過了很多,隨着通用頂級域名(TLD)變得更加普遍,這將成爲一個很長的名單。這應該讓你很接近:

(?<[email protected])(?:[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,} 

或註釋:

(?<[email protected])        (?# Check it is preceeded with @) 
(?:         (?# start of subdomain block) 
[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9] (?# subdomain) 
\.)+        (?# end of subdomain, including dot, repeats) 
[a-zA-Z0-9]{2,}      (?# TLD) 
+0

在javascript中無法使用lookbehind – watzon

1

如果你不希望找到一個有效的電子郵件,住址的正則表達式,因爲ü可以predetermant你有一個(如果電子郵件的是不會忽略一個網頁,他們大多是有效的)u可以使用這樣的:

域名不能包含@的這個U可以消耗所有的字符,直到最後@

(.*)@(.*)

,你可以肯定ü有你的域名,第二組

+0

實際上有一個允許多個@符號的電子郵件地址標準。 – Qix

1

+1 @strah中,答案的偉大工程,但在這個例子中「@ example.domain」回報率「example.domain 「在我看來,它應該是空的,因爲它不是一個有效的電子郵件。

如果你想成爲額外的嚴格的有關電子郵件的格式,你可以做如下:

var r = /[^\s][email protected]([^\s]+)/; 
r.exec("[email protected]")[1]; //outputs: testing.domain 
r.exec("@testing.domain")[1]; //outputs: null 
+0

如果您想測試電子郵件的有效性,那麼RegExp會變得非常複雜。我的解決方案並不意味着要做這樣的事情。不過,我喜歡你的。它更強大一點。 – strah

+0

是的,假設我們有一個帶有標記功能的文本,就像這個@strah一樣。在你寫的正則表達式中,這個域名應該是sth,它是一個人,你:) –

+2

我仍然推薦用'[^ ​​\ s]'代替'.',就像在Strah的回答中一樣。 – Qix

0

你應該能夠找到電子郵件,並捕獲在一個單一的操作
域部分相結合,與一個單一的正則表達式。

使用html5規範中的正則表達式作爲示例,但使用您的
並只插入捕獲組。

# http://www.w3.org/TR/html5/forms.html#valid-e-mail-address 
# /[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected]([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)/ 


[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+ 
@ 
(         # (1 start) 
     [a-zA-Z0-9] 
     (?: 
      [a-zA-Z0-9-]{0,61} 
      [a-zA-Z0-9] 
    )? 
     (?: 
      \. 
      [a-zA-Z0-9] 
      (?: 
       [a-zA-Z0-9-]{0,61} 
       [a-zA-Z0-9] 
      )? 
    )* 
)         # (1 end) 
相關問題