嵌套捕获组如何在正则表达式中编号?
对于正则表达式应如何处理嵌套括号的捕获行为,是否存在已定义的行为?更具体地说,您是否可以合理地期望不同的引擎将在第一个位置捕获外部括号,并在随后的位置捕获嵌套的括号?
考虑以下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可比正则表达式”或其他名称。或者只是剥离含义的字母。
以上是 嵌套捕获组如何在正则表达式中编号? 的全部内容, 来源链接: utcz.com/qa/401274.html

