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

有没有办法为PCRE正则表达式来算一个字符遇到(n)的有多少事件,并停止搜索后,发现n个的另一个角色(尤其{}

这是为了抓住码块(其可以或可以不具有嵌套在其中代码块)。

如果它使简单的输入将是单行线,比其他大括号中唯一字符是数字,冒号和逗号。 输入必须通过以下标准前的代码块甚至企图提取:

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

所有括号将有一个匹配对,和正确地嵌套。

我想知道,如果可以做到这一点之前,我开始写一个脚本来检查每个字符的字符串和计数梅开二度的每一次出现。 正则表达式将更多的内存友好,因为这些字符串可以是几千字节的大小!

谢谢,mniz。

http://stackoverflow.com/questions/2344747/pcre-lazy-and-greedy-at-the-same-time-possessive-quantifiers/2353753#2353753

--------------解决方案-------------

PCRE有递归模式,这样你就可以做这样的事情

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

其他的事情,我不认为这将是更快,更少的内存占用比简单的计数器,尤其是在大型的字符串。

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

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

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

你应该只遍历串字符一个字符,并保持嵌套层次的计数。

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

其中:25第一行表示事件的最大数量。 然后检查:

$n=count($matches);

这是不可能的,因为你所描述的语言是不是正规的语言。

使用一个解析器来代替。

我创建了一个解决方案,并已张贴作为对我的前一个问题的答案。

感谢您的帮助,mniz。

分类:php 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.650 (s). 10 q(s)