非捕捉以及捕捉匹配

时间:2014-02-26 00:50:30

标签: c# regex

我正在尝试从巨大的域名列表中捕获子域名。例如,我想从“funstuff.mysite.com”捕捉“funstuff”。我不想在比赛中捕获“.mysite.com”。这些出现在文本的海洋中,所以我不能依赖它们在一条线的起点。我知道子域名不包含任何特殊字符或数字。所以我拥有的是:

[a-z]{2,10}(?=\.mysite\.com)

问题是只有当子域前面没有数字或特殊字符时才会起作用。例如,“asdfbasdasdfdfunstuff.mysite.com”将返回“fdfunstuff”,但“asdfasf23 / funstuff.mysite.com”将不会匹配。

我不能依赖于子域之前存在特殊字符,如“http://funstuff.mysite.com”中的“/”,因此不能用作条件的一部分。

如果捕获在子域之前得到错误的文本,这是可以的,尽管99%的时间它将在其他小写字母之前。我试过了,

(?<=[^a-z])[a-z]{2,10}(?=\.mysite\.com)

但由于某些原因,这不会捕获文本,例如:

afb"asdfunstuff.mysite.com

引号阻止匹配[a-z]{2-20}的位置。基本上我在这种情况下想做的就是捕获asdfunstuff.mysite.com。如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

所以你有两个问题需要解决:首先,你要匹配“.mysite.com”但不能捕获它;第二,你想在“子域”位置最多抓取10个字母字符。

第一个问题可以通过使用捕获组来解决。正则表达式

([a-z]{2,10})\.mysite\.com

将捕获2到10个字符之间的某个位置,返回的match对象将在其中一个属性中显示该属性(取决于语言)。 C#返回Match个对象的集合,因此它将是唯一的项目。

第二个问题可以通过使用单词边界字符\b来解决。 In .NET, this matches where an alphanumeric (i.e. \w) is next to a non-alphanumeric (\W).其他语言(例如ECMAScript / Javascript)工作正常。

所以,我建议使用以下正则表达式来解决您的问题:

\b([a-z]{2,10})\.mysite\.com

请注意,数字在子域名中也是合法的,因此以下内容可能通常是正确的(尽管可能不在您的特定情况下):

\b(\w{2,10})\.mysite\.com

其中“单词字符”\w等同于.NET的ECMAScript兼容模式中的[a-zA-Z_0-9]。 (Further reading.