4

注意力!这与正则表达式问题无关,匹配整个字符串而不是部分


大家好。我试着做

Match y = Regex.Match(someHebrewContainingLine, @"^.{0,9} - \[(.*)?\s\d{1,3}");

除了其他 VS 希伯来语怪癖(在编辑字符串时,您如何将 ] 替换为 [ ?),它偶尔会返回疯狂的结果:

Match.Captures.Count = 1;
Match.Captures[0] = whole string! (not expected)
Match.Groups.Count = 2; (not expected)
Match.Groups[0] = whole string again! (not expected)
Match.Groups[1] = (.*)? value (expected).

Regex.Matches()以同样的方式行事。

这种行为的一般原因是什么?Regex.Match("-היי45--", "-(.{1,5})-") 注意:在简单的测试字符串(例如(示例显示不正确!,请查看页面的源代码))上,它不会以这种方式起作用,正则表达式一定有一些东西使它变得贪婪。匹配的字符串包含[ .... ],但简单地将它们添加到测试字符串不会产生相同的效果。

4

3 回答 3

6

当我第一次开始使用 .NET 正则表达式时,我也遇到了这个问题。理解这一点的方法是理解Group成员Match是嵌套成员。您必须遍历Groups才能降低捕获量。组也有Capture成员。有点像顶部的Match“组”,因为它代表整个字符串与您的表达式的成功“匹配”。单个输入字符串可以有多个匹配项。该Captures成员代表您的完整表达的匹配。

只要你有一个单一的捕获,Group[1]将永远是你感兴趣的数据。看看这个页面。示例 2 和 3 中的源代码经过硬编码以打印出来Groups[1]

请记住,单个捕获可以在单个匹配操作中捕获多个子字符串。如果是这种情况,那么您会看到Match.Groups[1].Captures.Count大于 1。另外,我认为如果您将多个匹配的文本行传递给单个Match调用,那么您会看到Match.Captures.Count大于 1,但每个顶层Match.Captures都是完整的与您的完整表达式匹配的字符串。

于 2012-08-10T19:46:22.393 回答
4

模式中有一个捕获组;即第 1 组。

总是有第 0 组,即整场比赛。

所以一共有2组。

于 2012-08-10T19:46:19.843 回答
1

我的测试正则表达式与项目范围内的任何其他正则表达式都不同(当 Perl 人来到 C# 时会发生这种情况),因为它没有前瞻/后瞻。所以这个发现需要一些时间。

现在,为什么我们应该将 Regex 行为称为undocumented,而不是undefined

让我们对"1.234567890".

  • 类似 PCRE 的语法:(.)\.2345678
  • 前瞻语法:(.)(?=\.\d)

当您进行正常匹配时,无论您将父大小放在哪里,结果都是从行的整个匹配部分复制的;如果存在前瞻,则复制不属于它们的任何内容。

因此,比赛将返回:

  • PCRE:(1.2345678 在 2300,这看起来像原始字符串,我开始在这里大喊大叫)
  • 展望:1
于 2012-08-10T21:20:36.677 回答