【发布时间】:2010-11-21 18:51:11
【问题描述】:
对于正则表达式应如何处理嵌套括号的捕获行为,是否有定义的行为?更具体地说,您是否可以合理地期望不同的引擎会在第一个位置捕获外括号,而在后续位置捕获嵌套括号?
考虑以下 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 与等不同)?
【问题讨论】:
-
如果您真的对所有正则表达式风格感兴趣,那么“语言不可知”标签就是您想要的。有太多的风格无法一一列举,而且大多数都不符合任何真正的标准(尽管它们在捕获组编号方面非常一致)。
-
可以使用$1、$2、$3....等方式访问该组。如何进入第十组?会是10美元吗?我不认为 10 美元会起作用,因为它将被解释为 1 美元后跟 0。这是否意味着我们最多只能有 9 个组?如果作者可以,请将此作为问题的一部分,那么这将是一个了解正则表达式中嵌套组的所有信息的地方。
标签: java .net regex perl language-agnostic