gpt4 book ai didi

regex - .NET Capture、Group、Match 之间的差异

转载 作者:行者123 更新时间:2023-12-04 13:29:47 24 4
gpt4 key购买 nike

我正在使用 .NET Regex 类型制作一个小应用程序。而“捕获、分组和匹配”类型完全让我感到困惑。我从未见过如此丑陋的解决方案。有人可以为我解释一下它们的用法吗?非常感谢。

最佳答案

这是一个比@Dav 引用的文档中的示例更简单的示例:

string s0 = @"foo%123%456%789";
Regex r0 = new Regex(@"^([a-z]+)(?:%([0-9]+))+$");
Match m0 = r0.Match(s0);
if (m0.Success)
{
Console.WriteLine(@"full match: {0}", m0.Value);
Console.WriteLine(@"group #1: {0}", m0.Groups[1].Value);
Console.WriteLine(@"group #2: {0}", m0.Groups[2].Value);
Console.WriteLine(@"group #2 captures: {0}, {1}, {2}",
m0.Groups[2].Captures[0].Value,
m0.Groups[2].Captures[1].Value,
m0.Groups[2].Captures[2].Value);
}

结果:
full match: foo%123%456%789 group #1: foo group #2: 789 group #2 captures: 123, 456, 789 full matchgroup #1 结果很简单,但其他的需要一些解释。如您所见,第 2 组位于由 + 量词控制的非捕获组内。它匹配了 3 次,但是如果您请求它的 Value ,您只能得到它第三次匹配的内容——最终捕获。类似地,如果您在替换字符串中使用 $2 占位符,则最终捕获将插入其位置。

在大多数正则表达式风格中,这就是你所能得到的;每个中间捕获被下一个覆盖并丢失; .NET 在保留所有捕获并在执行匹配后使它们可用方面几乎是独一无二的。您可以像我在这里所做的那样直接访问它们,或者像访问 CaptureCollection 一样遍历 MatchCollection 。但是, $1 样式的替换字符串占位符没有等效项。

所以 API 设计如此丑陋(如你所说)的原因有两个:首先,它从 Perl 的完整正则表达式支持改编为 .NET 的面向对象框架;然后将 CaptureCollection 结构嫁接到它上面。 Perl 6 提供了一个更简洁的解决方案,但作者实际上是通过从头开始重写 Perl 并放弃向后兼容性来实现的。

关于regex - .NET Capture、Group、Match 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250335/

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