使用命名的捕获组会导致不同的匹配

时间:2019-01-24 01:25:07

标签: c# .net regex

给出正则表达式:-w

测试输入:^(Start\.)?(.+?)(\.|\.\2)?(End)?$

我获得“ {2}组的Start.Word.WordEnd

enter image description here

但是,如果我将正则表达式更改为还包括捕获组的名称,则会得到不同的结果:

正则表达式:Word

capturedGroup为^(Start\.)?(?<capturedGroup>.+?)(\.|\.\2)?(End)?$

enter image description here

.NET 4.7.2中(我也在https://dotnetfiddle.net/中进行了测试,结果相同)。链接:

第一种情况:https://dotnetfiddle.net/o33G6Y

第二种情况:https://dotnetfiddle.net/4zJuaQ

我在https://regex101.com/(设置为PHP)中进行了测试,并得到了预期的结果(均为Word.Word),所以我希望这是一个.NET问题?请帮忙。

2 个答案:

答案 0 :(得分:1)

请参见.NET Grouping Constructs regex docs

  

命名的匹配子表达式在匹配的子表达式之后从左到右连续编号。

因此,您的模式组将按以下顺序进行解析:

^(Start\.)?(?<capturedGroup>.+?)(\.|\.\2)?(End)?$
 ^---1---^ ^-------- 4 --------^^---2---^ ^-3-^

调试时,您可以检查真实的组数字ID:

enter image description here

您只需要使用命名的组反向引用\k<capturedGroup>,或使用\4而不是\2(这不是那么直观,所以我宁愿您使用前者解决方案)。

  • ^(Start\.)?(?<capturedGroup>.+?)(\.|\.\k<capturedGroup>)?(End)?$-Demo 1
  • ^(Start\.)?(?<capturedGroup>.+?)(\.|\.\4)?(End)?$-Demo 2

输出:

enter image description here

答案 1 :(得分:0)

我认为这个问题是由于\ 2与表达式中第二个括号中的内容匹配而导致的,现在它已不匹配了。

也许是因为它被命名,并且您将在两个组中具有相同的名称。