6

我有以下正则表达式:

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

这个示例字符串:

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

我希望 RegEx 产品具有以下匹配项:def.example.comjkl.example.com. 我必须改变什么?应该在 example.com 的所有子域上工作。如果可能的话,它应该只采用第一个子域级别(abc.def.example.com-> def.example.com)。

在正则表达式上测试它,没有完全工作:( 截屏

4

2 回答 2

10

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

解释

  • [^.\s]+: 匹配除点或空格之外的任何内容一次或多次
  • \.example\.com: 匹配example.com

请注意,您不需要在字符类中转义点

于 2013-07-15T14:38:50.650 回答
4

顺便说一句,虽然 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.comjkl.example.com,而:

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

. . . 应该只给你:def.example.com

于 2013-07-15T15:57:00.367 回答