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