4

PCRE 正则表达式有没有办法计算它遇到的字符的出现次数 (n),并在找到另一个字符的 n 次出现后停止搜索(特别是{and })。

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

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

$regex = '%^(\\d|\\:|\\{|\\}|,)*$%';

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

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

谢谢,米尼兹。

解决方案

PCRE:同时是懒惰和贪婪(占有量词)

4

4 回答 4

4

这正是正则表达式不好的地方。这是经典的例子。

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

于 2010-02-27T19:08:31.960 回答
4

pcre 有递归模式,所以你可以做这样的事情

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

另一件事,我认为这不会比简单的计数器更快或更少的内存消耗,尤其是在大字符串上。

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

preg_match_all('~ { ( (?>[^{}]+) | (?R) )* } ~x', $input, $blocks);
print_r($blocks);
于 2010-02-27T19:30:05.530 回答
0
$regex='%^(\\d|\\:|\\{|\\}|,){0,25)$%';
preg_match($regex,$target,$matches);

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

$n=count($matches);
于 2010-02-27T19:08:43.707 回答
0

这是不可能的,因为您描述的语言不是常规语言

请改用解析器。

于 2010-02-27T19:08:47.680 回答