UB:C#的Regex.Match在匹配时返回整个字符串而不是部分

时间:2012-08-10 19:28:38

标签: c# regex right-to-left

注意!这是与Regex problem, matches the whole string instead of a part

相关的 NOT

大家好。 我试着做

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})-") 这样简单的测试字符串(样本显示不正确!,请查看页面的源代码),这样做的正则表达式必须有它很贪心。匹配的字符串包含[ .... ],但只是将它们添加到测试字符串不会产生相同的效果。

3 个答案:

答案 0 :(得分:5)

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

只要您拥有一次捕获,Captures将始终是您感兴趣的数据。请查看this page。示例2和3中的源代码是硬编码的,以打印出Group[1]

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

答案 1 :(得分:3)

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

总是有0组,这是整场比赛。

因此总共有2组。

答案 2 :(得分:1)

我的测试正则表达式与项目范围内的任何其他正则表达式不同(这就是当Perl家伙来到C#时会发生什么),因为它没有前瞻/外观。所以这个发现花了一些时间。

现在,为什么我们应该将正则表达式行为称为无证件,而不是未定义

让我们针对"1.234567890"进行一些匹配。

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

当你进行正常比赛时,无论你把parentesizes放在哪里,结果都会从整个匹配的线条中复制出来;如果存在前瞻,则复制任何不属于它们的内容。

所以,比赛将返回:

  • PCRE:1.2345678(在2300,看起来像原始字符串,我开始在这里大喊大叫)
  • lookahead:1