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

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

考虑以下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

回到顶部