顺便说一句,虽然 HamZa 的答案适用于您当前的示例代码,但如果您需要确保域名也有效,您可能想尝试不同的方法,因为[^.\s]+
它将匹配任何不是空格或a .
(例如,该正则表达式将匹配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;
// 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