3

我试图理解以下段落(来自 Php.net: Link):

但是,如果反斜杠后面的十进制数小于 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?

如果有人可以帮助理解这一段,谢谢大家,祝你有美好的一天。

4

2 回答 2

2

在字符类之外,后跟大于 0 的数字(可能还有更多数字)的反斜杠是对模式中较早(即其左侧)捕获子模式的反向引用,前提是之前存在许多捕获左括号。

但是,如果反斜杠后面的十进制数小于 10,则始终将其作为反向引用,并且仅当整个模式中没有那么多捕获左括号时才会导致错误。换句话说,对于小于 10 的数字,引用的括号不必位于引用的左侧。当涉及重复并且右侧的子模式参与了较早的迭代时,“向前向后引用”可能有意义.

\n解释(n > 0总是):

  • n <= 9: 始终是对第 th 组的反向引用n(无论捕获组在哪里)。n如果捕获组少于 ,则会导致错误。
  • n >= 10:如果在它之前至少有n多个捕获组(开始),则只有一个反向引用。否则,它是一个转义序列,就像在常规字符串中一样。
于 2013-03-08T15:39:31.230 回答
1

换句话说,对于小于 10 的数字,引用的括号不必位于引用的左侧。当涉及重复并且右侧的子模式参与了较早的迭代时,“向前向后引用”可能有意义.

这意味着这样的事情是有效的:

(0\2|(112*))+

如您所见,甚至在遇到\2第二个左括号之前就声明了对第二个捕获组的反向引用。(

演示(忽略regex101的错误,分析没有处理这种情况)

另一个有效的例子:

^(^a|aa\1)*$

此正则表达式将匹配任何仅包含a长度为平方数的字符串,否则拒绝。这是被引用的括号内的反向引用示例。

演示

于 2013-03-08T15:40:07.553 回答