gpt4 book ai didi

c# - 非捕获和捕获匹配

转载 作者:行者123 更新时间:2023-11-30 17:49:12 24 4
gpt4 key购买 nike

我正在尝试从庞大的域名列表中捕获子域。例如,我想从“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。如何做到这一点?

最佳答案

所以你有两个问题要解决:第一,你想匹配“.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. )

关于c# - 非捕获和捕获匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com