只需在一个侧面说明逃脱点,而哈姆扎的答案适用于当前的示例代码,如果您需要确保域名也是有效的,你可能想尝试不同的方法,因为[^.\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.com
和jkl.example.com
,而:
var domainString = "test foo abc.def.example.com bar ghi.jk&^%&*(l.example.com def";
。 。 。应该只给你:def.example.com
我认为你的意思是'(?<!\。)'而不是'[!?\。]''。 '(?<!)'是一个负面反序,不幸的是它在Javascript中不被支持。 ''[!?\。]'会匹配'!'或'?'或'.',基本上和'(?:!| \?| \。)'相同。 – HamZa