我有点搞不清楚"团队"和"捕获"之间的区别.NET的正则表达式语言.考虑下面的C代码:

MatchCollection matches = Regex.Matches("{Q}", @"^\{([A-Z])\}$");

我希望这会导致对字母"Q"的单个捕获,但如果我打印返回的MatchCollection的属性,我会看到:

matches.Count: 1
matches[0].Value: {Q}
        matches[0].Captures.Count: 1
                matches[0].Captures[0].Value: {Q}
        matches[0].Groups.Count: 2
                matches[0].Groups[0].Value: {Q}
                matches[0].Groups[0].Captures.Count: 1
                        matches[0].Groups[0].Captures[0].Value: {Q}
                matches[0].Groups[1].Value: Q
                matches[0].Groups[1].Captures.Count: 1
                        matches[0].Groups[1].Captures[0].Value: Q

这里到底是怎么回事?我知道整场比赛也有一次抓捕,但是小组是怎么进来的呢?为什么matches[0].Captures不包括字母"q"的捕获?

推荐答案

你不会是第一个对此感到困惑的人.以下是著名的Jeffrey Friedl人对此的看法(第437+页):

根据你的观点,它要么增加

此外:

一组人之间的主要区别是 对象和捕获对象是 每个Group对象都包含一个 表示以下内容的捕获集合 所有intermediary场比赛都是由 组在比赛期间,以及 组匹配的最终文本.

几页之后,他的结论是:

在通过考试之后.网

换句话说:它们非常相似,但偶尔,你会发现它们的用处.在你长出另一把灰胡子之前,你甚至可能会喜欢上它...


由于上述内容和另一篇文章中所说的似乎都没有真正回答您的问题,请考虑以下几点.将捕获视为一种历史跟踪器.当正则表达式进行匹配时,它从左到右遍历字符串(暂时忽略回溯),当它遇到匹配的捕获括号时,它会将其存储在$x(x是任意数字)中,比方说$1.

在重复捕获括号时,普通正则表达式引擎将丢弃当前的$1,并将其替换为新值.不NET,它将保持这段历史并将其放入Captures[0].

如果我们将您的正则表达式更改为如下所示:

MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"(\{[A-Z]\})+");

您将注意到,前Group个组将有一个Captures(第一个组始终是整个比赛,即等于$0),而第二个组将拥有{S}个,即只有最后一个匹配组.但是,这里有个问题,如果你想找到另外两个,它们在Captures,它包含了{Q},{R}{S}的所有中间捕获.

如果您曾经想知道如何才能从多重捕获中获得结果,因为它只显示与字符串中明显存在的各个捕获的最后匹配,那么您必须使用Captures.

A final word on your final question: the total match always has one total Capture, don't mix that with the individual Groups. Captures are only interesting inside groups

.net相关问答推荐

找不到包Microsoft.VisualStudio.Azure.Containers.Tools.Targets

跨请求共享数据

我的Azure应用服务从哪里获取应用设置?

在 .NET 7 项目上设置 Sentry 时遇到问题

ECS服务无法从Cognito获取配置

AppShell - 返回导航失败,匹配的路由不明确......但我只注册了一次路由

使用 Task.WhenAll 但需要跟踪每个单独的 Task 的成功

如何确定计时器是否正在运行?

"投掷;" 是什么意思?靠自己做什么?

C# - 获取不包括隐藏文件的文件列表

maxRequestLength 的最大值?

如何让 DateTimePicker 显示一个空字符串?

Silverlight 与 Flex

如何更改 double.ToString() 中小数点的符号?

在关闭警告中访问 foreach 变量

获取系统中已安装的应用程序

如何将 .NET 应用程序编译为本机代码?

Roslyn 编译代码失败

在 try/catch/finally 中等待的一个很好的解决方案?

不签署 .NET 程序集有什么问题吗?