Php,Regex,Back references

时间:2013-03-08 15:24:02

标签: php regex backreference

我想了解以下段落(来自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?

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

2 个答案:

答案 0 :(得分:2)

  

在字符类之外,反斜杠后跟一个数字更大   0(以及可能的其他数字)是对a的反向引用   在模式中更早地(即向左)捕获子模式,   前提是有许多以前的捕获   括号中。

     

但是,如果反斜杠后面的十进制数小于   在图10中,它总是作为后向引用,并且仅引起错误   如果没有那么多人捕获整个左括号   图案。换句话说,引用的括号不需要   对于小于10的数字,在参考的左边。“向前   反向引用“当涉及重复时可以有意义   右侧的子模式参与了之前的迭代。

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

  • n <= 9:始终是对n组的反向引用(无论捕获组位于何处)。如果捕获组少于n,则会导致错误。
  • n >= 10:如果前面至少有n个捕获组(起始),则只有后退参考。否则它是常规字符串中的转义序列。

答案 1 :(得分:1)

  

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

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

(0\2|(112*))+

如您所见,即使在遇到第二个开始括号\2之前,也会声明对第二个捕获组(的反向引用。

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

另一个有效的例子:

^(^a|aa\1)*$

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

Demo