2013-07-15 31 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]' –

相关问题