Есть ли способ регулярных выражений 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);
Это невозможно, так как язык, который вы описываете, не является обычным языком .
Вместо этого используйте синтаксический анализатор.