PHP, REGEXP как найти закрывающую скобку выражения в тексте
Есть текст с выражениями, вида
\run{{A} {B}} {{{C}}{D}}{E}
Как я могу гарантировано получить часть \run{{A} ? Нужно поставить разделитель между {A} и {B}, при условии что содержимое A может содержать вложенные выражения в скобках A = {{test}{test}} По сути нужно найти Закрывающую скобку конкретного выражения. Я пробовал /\\run{(.*)}/ и затем /{([\s\S]+?)}/ но это работает только если не появляется дополнительной вложенности выражений
Ответы (1 шт):
В общем случае математические и текстовые выражения со сложной скобочной структурой не парсятся регулярками. Так или иначе, без перебора не обойтись.
Если у вас А - это строго то, что находится после \run{{ и перед }, которая относится к этой второй скобке: \run{{, то так:
- заводите счетчик
i = 0; - также инициализируете
resStr = '\run{{'; - начинаете перебор с символа сразу после
\run{{ - если символ == "{", то i++, если == "}", то i--, если символ не скобка - ничего
- на каждом шагу добавляете проверяемый символ в
resStr - просматриваете строку до тех пор пока счетчик
i не станет == -1 - все.
resStr == '\run{{...}'
Ну и замена \run{{...} на \run{{...}delimiter