给出正则表达式:-w
测试输入:^(Start\.)?(.+?)(\.|\.\2)?(End)?$
我获得“ {2}组的Start.Word.WordEnd
:
但是,如果我将正则表达式更改为还包括捕获组的名称,则会得到不同的结果:
正则表达式:Word
capturedGroup为^(Start\.)?(?<capturedGroup>.+?)(\.|\.\2)?(End)?$
.NET 4.7.2中(我也在https://dotnetfiddle.net/中进行了测试,结果相同)。链接:
第一种情况:https://dotnetfiddle.net/o33G6Y
第二种情况:https://dotnetfiddle.net/4zJuaQ
我在https://regex101.com/(设置为PHP)中进行了测试,并得到了预期的结果(均为Word.Word
),所以我希望这是一个.NET问题?请帮忙。
答案 0 :(得分:1)
请参见.NET Grouping Constructs
regex docs:
命名的匹配子表达式在匹配的子表达式之后从左到右连续编号。
因此,您的模式组将按以下顺序进行解析:
^(Start\.)?(?<capturedGroup>.+?)(\.|\.\2)?(End)?$
^---1---^ ^-------- 4 --------^^---2---^ ^-3-^
调试时,您可以检查真实的组数字ID:
您只需要使用命名的组反向引用\k<capturedGroup>
,或使用\4
而不是\2
(这不是那么直观,所以我宁愿您使用前者解决方案)。
^(Start\.)?(?<capturedGroup>.+?)(\.|\.\k<capturedGroup>)?(End)?$
-Demo 1 ^(Start\.)?(?<capturedGroup>.+?)(\.|\.\4)?(End)?$
-Demo 2 输出:
答案 1 :(得分:0)
我认为这个问题是由于\ 2与表达式中第二个括号中的内容匹配而导致的,现在它已不匹配了。
也许是因为它被命名,并且您将在两个组中具有相同的名称。