嵌套捕获组如何在正则表达式中编号?

艾伦·斯托姆(Alan Storm):

对于正则表达式应如何处理嵌套括号的捕获行为,是否存在已定义的行为?更具体地说,您是否可以合理地期望不同的引擎将在第一个位置捕获外部括号,并在随后的位置捕获嵌套的括号?

考虑以下PHP代码(使用PCRE正则表达式)

<?php
  $test_string = 'I want to test sub patterns';
  preg_match('{(I (want) (to) test) sub (patterns)}', $test_string, $matches);
  print_r($matches);
?>

Array
(
    [0] => I want to test sub patterns  //entire pattern
    [1] => I want to test           //entire outer parenthesis
    [2] => want             //first inner
    [3] => to               //second inner
    [4] => patterns             //next parentheses set
)

首先捕获整个带括号的表达式(我要测试),然后捕获内部的带括号的模式(“ want”和“ to”)。这是合乎逻辑的,但是我可以看到,首先捕获子括号然后再捕获整个模式的情况同样合理。

因此,这是“捕获整个事物优先”在正则表达式引擎中定义的行为,还是取决于模式的上下文和/或引擎的行为(PCRE与C#不同,而Java与Java不同)比等)?

道:

perlrequick

如果正则表达式中的分组是嵌套的,则$ 1将获得最左括号开头的组,$ 2将得到下一个括号开头的组,依此类推。

注意:不包括非捕获组的开头括号(?=)

更新资料

我使用PCRE的程度不高,因为通常使用的是真实的;),但是PCRE的文档显示的内容与Perl相同:

子公司

2.它将子模式设置为捕获子模式。这意味着,当整个模式匹配时,与子模式匹配的主题字符串部分将通过的ovector参数传递回调用方pcre_exec()从左到右(从1开始)对左括号进行计数,以获取捕获子图案的编号。

例如,如果字符串“ the red king”与该模式匹配

the ((red|white) (king|queen))

捕获的子字符串为“红色国王”,“红色”和“国王”,并分别编号为1、2和3。

如果PCRE偏离了Perl regex兼容性,则可能应重新定义首字母缩写-“ Perl关联正则表达式”,“ Perl可比正则表达式”或其他名称。或者只是剥离含义的字母。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章