PCRE:找到代码块的匹配括号

时间:2010-02-27 19:04:52

标签: php nested pcre codeblocks curly-braces

PCRE正则表达式是否有办法计算遇到的字符出现次数(n),并在找到n次出现的另一个字符后停止搜索(具体为{和{{1} })。

这是为了获取代码块(可能有也可能没有嵌套在其中的代码块)。

如果它变得更简单,输入将是单行字符串,除了大括号之外的唯一字符是数字,冒号和逗号。在尝试提取代码块之前,输入必须通过以下条件:

}

所有大括号都有匹配的对,并且嵌套正确。

我想知道在开始编写脚本以检查字符串中的每个字符并计算每次出现的括号之前是否可以实现这一点。正则表达式将更加内存友好,因为这些字符串的大小可以是几千字节!

谢谢,mniz。

解决方案

PCRE: Lazy and Greedy at the same time (Possessive Quantifiers)

4 个答案:

答案 0 :(得分:4)

这正是正则表达式的好处。这是典型的例子。

您应该逐个字符地迭代字符串,并保持嵌套级别的计数。

答案 1 :(得分:4)

pcre有recursive patterns,所以你可以做这样的事情

$code_is_valid = preg_match('~^({ ( (?>[^{}]+) | (?1) )* })$~x', '{' . $code .'}');

另一方面,我不认为这比简单的计数器更快或更少内存消耗,特别是在大字符串上。

这就是如何在字符串中找到所有(有效)代码块

preg_match_all('~ { ( (?>[^{}]+) | (?R) )* } ~x', $input, $blocks);
print_r($blocks);

答案 2 :(得分:0)

$regex='%^(\\d|\\:|\\{|\\}|,){0,25)$%';
preg_match($regex,$target,$matches);

其中:第一行25表示最大出现次数。然后检查:

$n=count($matches);

答案 3 :(得分:0)

这是不可能的,因为您描述的语言不是regular language

改为使用解析器。