2013-07-15 27 views
6

我有以下的正則表達式:JavaScript的正則表達式是獲取所有子域

[!?\.](.*)\.example\.com 

和這個樣本字符串:

test foo abc.def.example.com bar ghi.jkl.example.com def 

我想的是,正則表達式的產品下面的比賽:def.example.comjkl.example.com。 我必須改變什麼?應該在example.com的所有子域上工作。如果可能的話,它應該只採用第一個子域級別(abc.def.example.com - >def.example.com)。

測試了regexpal,沒有充分的工作:( Screenshot

+0

我認爲你的意思是'(?<!\。)'而不是'[!?\。]''。 '(?<!)'是一個負面反序,不幸的是它在Javascript中不被支持。 ''[!?\。]'會匹配'!'或'?'或'.',基本上和'(?:!| \?| \。)'相同。 – HamZa

回答

3

只需在一個側面說明逃脫點,而哈姆扎的答案適用於當前的示例代碼,如果您需要確保域名也是有效的,你可能想嘗試不同的方法,因爲[^.\s]+將匹配ANY字符不是空格或.(例如,該正則表達式將匹配jk&^%&*(l.example.com作爲「有效」子域)。

由於域名值的有效字符遠少於無效字符,因此您可以考慮對正則表達式使用「加法」方法,而不是減法。這種模式可能是您尋找有效域名的那個:/(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi

將其分解多一點。 。 。

  • (?:[\s.]) - 這將標誌着loweset級子域名的開始
  • ([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)空間或.匹配 - 這捕獲一組字母,數字或破折號,必須開始並以字母或數字結束(域名規則),然後是域名example.com
  • gi - 使得正則表達式的貪婪和不區分大小寫

在這一點上,它只是抓住了比賽的問題。由於.match()不正規表達式「非捕獲組」發揮出色,使用.exec()代替:

var domainString = "test foo abc.def.example.com bar ghi.jkl.example.com def"; 
var regDomainPattern = /(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi; 
var aMatchedDomainStrings = []; 
var patternMatch; 

// loop through as long as .exec() still gets a match, and take the second index of the result (the one that ignores the non-capturing groups)   
while (null != (patternMatch = regDomainPattern.exec(domainString))) { 
    aMatchedDomainStrings.push(patternMatch[1]); 
} 

此時aMatchedDomainStrings應該包含所有有效,第一級,子域。

var domainString = "test foo abc.def.example.com bar ghi.jkl.example.com def"; 

。 。 。應該讓你:def.example.comjkl.example.com,而:

var domainString = "test foo abc.def.example.com bar ghi.jk&^%&*(l.example.com def"; 

。 。 。應該只給你:def.example.com

+0

我不想破壞情緒,但請注意,域名不僅僅支持字母,數字和連字符。尋找這個域名爲'http:// aa.com'的例子,不要忘記像'http://سجل.السعودية'這樣的UTF8域名:p – HamZa

+1

@HamZa - 不確定我們是否真的想進入DNS vs. IDNA在這個問題的評論部分討論。 :)但最終,它仍然不會改變我的觀點。 。 。而不是允許任何字符,除了空格或'.'(這肯定會允許無效的域名字符),如果他想匹配有效性,他將需要識別他想允許的字符並相應地設置模式匹配。 。 。他是否想要使用DNS或IDNA標準取決於他。 ;) – talemyn

8

您可以使用下面的表達式:[^.\s]+\.example\.com

說明

  • [^.\s]+:匹配任何東西,除了一個點或空白一次或多次
  • \.example\.com:匹配example.com

請注意,您不需要在字符類

+0

太棒了,謝謝!如何通過JavaScript在字符串中獲得此正則表達式的所有匹配項? 'str ='測試abc.def.example.com和ghi.jkl.example.com usw.'; str.match('[^。\ s] + \。example \ .com');'顯示我單個匹配... – fnkr

+2

@fnkr添加'g'標誌(用於全局):'str.match(/ [^。\ s] + \。example \ .com/g)'=>不含引號,但斜槓和正則表達式之外的'g'分隔'/'[同樣的規則適用於替換子字符串](http:// stackoverflow .com/questions/832257/javascript-multiple-replace/9514142#9514142) –

+1

@fnkr:'str.match(/ [^。\ s] + \。example \ .com/g);'returns a array' def.example.com,jkl.example.com]' –

相關問題