PCRE: найдите подходящую скобу для кодового блока

Есть ли способ регулярных выражений PCRE подсчитывать количество вхождений символа, с которым он сталкивается (n), и останавливать поиск после того, как он обнаружил n вхождений другого символа (в частности { и } ).

Это для захвата блоков кода (которые могут иметь или не иметь блоков кода, вложенных в них).

Если это упрощает, ввод будет однострочной строкой, причем единственными символами, отличными от фигурных скобок, являются цифры, двоеточия и запятые. Ввод должен пройти следующие критерии до того, как будут даже извлечены блоки кода:

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

Все фигурные скобки будут иметь соответствующую пару и правильно вложены.

Я хотел бы знать, может ли это быть достигнуто до того, как я начну писать скрипт, чтобы проверять каждый символ в строке и подсчитывать каждое появление скобки. Регулярные выражения были бы гораздо более дружественными к памяти, так как эти строки могут иметь размер в несколько килобайт!

Спасибо, мниз.

Решение

PCRE: Ленивый и Жадный в то же время (Possessive Quantifier)

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); 

Это невозможно, так как язык, который вы описываете, не является обычным языком .

Вместо этого используйте синтаксический анализатор.