PHP,正则表达式和反向引用

3
我正在尝试理解以下段落(来自Php.net:链接):
然而,如果反斜杠后面的十进制数小于10,则始终将其视为向后引用,并且仅在整个模式中没有那么多捕获左括号时才会导致错误。换句话说,引用的括号不需要在数字小于10的情况下位于引用左侧。当涉及重复并且右侧的子模式已参与先前迭代时,“正向向后引用”是有意义的。
据我所知,如果十进制数小于10,则计算模式中所有左括号的数量;如果数字大于10,则仅计算使用引用(\13,例如)的位置左侧的左括号。
例如:
假设我们有这个简单的模式:
'/^(a)(b)(c)(d)\6(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)$/';

This is the string we testing: abcdfefghikjklmn

据php.net所说:
换句话说,引用的括号可以不在参考数字左边,尤其是当数字小于10时。
因此,正如示例所示,所引用的括号位于右侧,而参考数字小于10,那么为什么preg_match返回0?
如果有人能帮忙理解这段文字,谢谢大家,祝您愉快!

有没有可能提供一些代码,展示你对哪些方面是清楚的或不清楚的? - MikeM
我会添加一些感谢。 - Aviel Fedida
1
回答您的编辑,除了您的测试字符串有太多的“k”之外,返回0是因为在遇到\6时第六个捕获组没有捕获任何内容,并且没有其他可匹配的内容。我认为不可能将反向引用与空值匹配。如果您使用了(\6|),那么它就可以工作了。 - MikeM
谢谢,我看到答案后明白了。 - Aviel Fedida
2个回答

2
在字符类之外,反斜杠后跟一个大于0的数字(可能还有更多数字)是对模式中早期(即在其左侧)捕获子模式的反向引用,前提是已经有了那么多以前的捕获左括号。
然而,如果反斜杠后面的十进制数小于10,则始终将其视为反向引用,并仅在整个模式中没有那么多捕获左括号时才导致错误。换句话说,所引用的括号不需要在小于10的数字的引用左侧。当涉及重复并且右侧的子模式参与了较早的迭代时,“前向反向引用”可能是有意义的。
"\n"的解释(n> 0总是成立):
- n <= 9:始终是对第n个组的反向引用(无论捕获组在哪里)。如果少于n个捕获组,则会导致错误。 - n >= 10:仅当至少有n个捕获组(开始)在其之前时才是反向引用。否则,它就像常规字符串中的转义序列。

1
换句话说,所引用的括号不必在小于10的数字的引用左侧。当涉及到重复并且右侧的子模式已经参与了早期迭代时,“前向后引用”是有意义的。这意味着像这样的东西是有效的:
(0\2|(112*))+

正如您所看到的,对于第二个捕获组\2的反向引用甚至在第二个开放括号(之前就被声明了。

演示(忽略regex101的错误,分析没有考虑到这种情况)

另一个有效的例子:

^(^a|aa\1)*$

这个正则表达式将匹配长度为完全平方数且只包含 a 的任何字符串,否则不予匹配。这是引用括号内部的反向引用的示例。

演示


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