这是对这个问题的跟进。
看看这个模式:
(o(?1)?o)
它匹配任何o
长度为 2 n且 n ≥ 1的序列。
它可以工作,请参阅 regex101.com(添加单词边界以便更好地演示)。
问题是:为什么?
在下文中,字符串的描述(匹配与否)将只是一个粗体数字或描述长度的粗体术语,如2 n。
分解(添加空格):
( o (?1)? o )
( ) # Capture group 1
o o # Matches an o each at the start and the end of the group
# -> the pattern matches from the outside to the inside.
(?1)? # Again the regex of group 1, or nothing.
# -> Again one 'o' at the start and one at the end. Or nothing.
我不明白为什么这不匹配2n,而是2 n,因为我会将模式描述为 *an undefined number of o o
,相互堆叠。
可视化:
没有递归,2是匹配的:
oo
一次递归,4是匹配:
o o
oo
到目前为止,很容易。
两次递归。显然是错误的,因为模式与6不匹配:
o o
o o
oo
但为什么?它似乎符合模式。
我得出的结论是,这不仅仅是重复的普通模式,否则6将不得不匹配。
(?P<name>[abc])(?1)(?P>name)
像 dos 一样匹配三个字母(?P<name>[abc])[abc][abc]
。
和
[abc])(?1){3}
[...] 相当于([abc])[abc]{3}
所以它似乎只是简单地重新匹配正则表达式代码,而没有关于捕获组的先前匹配的信息。
有人可以解释并想象为什么这个模式匹配2 n而没有别的吗?
编辑:
评论中提到过:
我怀疑在自身内部引用捕获组实际上是受支持的情况。
regular-expressions.info 确实提到了该技术:
如果您在它调用的组内发出呼叫,您将拥有一个递归捕获组。