仅作为侧面说明,虽然HamZa的答案适用于您当前的示例代码,但如果您需要确保域名也是有效的,则可能需要尝试不同的方法,因为[^.\s]+将匹配
任何不是空格或
.
的字符(例如,该正则表达式将将jk&^%&*(l.example.com作为“有效”的子域进行匹配)。
由于域名值的有效字符远少于无效字符,因此您可以考虑对正则表达式使用“加法”方法,而不是减法。这个模式可能是您要寻找的有效域名:
/(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi
进一步分解:
-
(?:[\s.])
— 匹配标记最低级子域名开始的空格或
.
-
([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;
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