正则表达式 (?<n>a)(b)\2(c) 匹配什么?

4
这个正则表达式匹配什么?
(?<n>a)(b)\2(c)

它不匹配abcabacabbcabccab\x02c,也不会抛出异常。


如果您去掉(c),它将匹配aba。我的理解是,未命名的捕获首先编号,然后是命名的捕获。所以(c)应该得到2,但我试图在定义之前进行反向引用,所以我想也许它会匹配a,并且当它遇到c时,a会被重新编号,但事实并非如此。

3个回答

3
它对我来说匹配“abbc”。我使用的是Perl正则表达式风格,group 1为“a”,group 2为“b”,group 3为“c”。\2指的是第二组,即“b”。 (?<n>a) - 命名捕获组:名称为“n”,正则表达式为“a”
(b)\2 - 捕获组匹配“b”,然后引用第二个组,即“b”
(c) - 第三个捕获组匹配“c”


抱歉,这被标记为.net是因为我想了解有关 .net 正则表达式的答案。 - mpen
1
在正则表达式中,未命名的捕获组从左到右首先编号。因此,“b”为1,“c”为2,而命名组“a”为3。这意味着在.NET中它应该匹配abcc,但是由于对捕获组的引用出现在实际捕获之前,所以它为空,因此失败。在http://www.regular-expressions.info/brackets.html中编辑:无法匹配,它不是无效的语法。 - Ketema

2

a的反向引用是“n”。b的引用是“1”,第三个是“2”。

(?<n>a)(b)\1(c) matches abbc where n is a, 1 is b and 2 is c

在it技术中,未命名的反向引用以1开始计数。非捕获括号不会被编号。因此,它无法匹配任何内容。

关于括号的正则表达式信息


是的,然后命名引用也会被编号。Regex.IsMatch("aa", @"(?<n>a)\1") == True。你还没有回答这个问题。\2匹配什么? - mpen
3
我相信第二个反向引用肯定是 'c',但它还没有匹配到任何东西,在评估时会为空,所以 \2 也不会匹配任何东西,使表达式无法匹配任何东西。 - Zachary Scott

1

\2在你的正则表达式中指向(c)组, 正如你的实验所显示的那样。不幸的是,你的正则表达式从未匹配到任何内容。

你可以在文档中找到参考 (尽管它不太清楚,并且似乎后面跟着一个无关的例子):

如果一个组没有捕获任何子字符串,对该组的反向引用是未定义的,永远不会匹配。


这个例子确实是相关的,但并不是很清晰。这里有一个更好的例子:Regex.IsMatch("ac", @"a(b)?\1c")。这是 False,而如果你把 ? 移到 () 里面,它就会是 true。在前者中,反向引用未定义,而在后者中,它是一个空字符串,但它们都匹配 abbc - mpen
因此,那个句子并没有完全回答我的问题,因为它指的是稍微不同的事情,但我认为结果是相同的。如果反向引用出现在捕获组之前,那么该引用可能未定义,因此永远不会匹配。 - mpen
嗯,是的,那样更好。MSDN的例子甚至没有反向引用,它只是说明了一个失败的组捕获。 - Kobi
很好的观点。如果它说“如果一个组还没有捕获任何子字符串但是,…”那就更好了。 - Kobi
这仍然是最权威的答案,而其他人只是在猜测,所以...谢谢 :) - mpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接