扫码一下
查看教程更方便
一些应用程序支持相对的反向引用。它们使用负数来引用反向引用之前的组。要查找相对反向引用所引用的组,要获取反向引用的绝对数量,并计算(从后向引用开始并通过正则表达式从右向左)那些捕获组的开括号。因此(a)(b)(c)\k<-1>
匹配abcc,(a)(b)(c)\k<-3>
匹配abca。如果后向引用在捕获组内部,则还需要计算该捕获组的开头括号。因此(a)(b)(c\k<-2>)
匹配abcb。(a)(b)(c\k<-1>)
不匹配或者是错误,具体取决于您的应用程序是否允许嵌套的反向引用。
嵌套反向引用的语法差异很大。通常,它是命名反向引用语法的扩展。JGsoft V2和Ruby 1.9及更高版本支持\k<-1>
和\k'-1'
。尽管这看起来像是用于命名捕获的.NET语法,但.NET本身不支持相对的反向引用。
Perl 5.10,PCRE 7.0,PHP 5.2.2和R支持\g{-1}
和\g-1
。
Boost支持从Boost 1.42开始的Perl语法。Boost从Boost 1.47开始添加Ruby语法。使事情变得复杂的是,Boost 1.47允许这些变量相乘。Boost 1.47和更高版本允许使用\g
或\k
以及花括号{}
,尖括号或引号指定相对反向引用。这样就产生了六个变体加上\ g-1
,总共有七种方式。这使Boost与Ruby,PCRE,PHP,R和JGsoft发生冲突,后者将\g
放在尖括号或引号中,并将负数视为相对子例程调用。