получать все вхождения строки и заменять их - PullRequest
1 голос
/ 30 апреля 2011

пример текста

this text will be left alone ##{class1}{arg1;arg2;arg3}## some other text and
another thingie ##{Class2}{]##

В настоящее время я использую это '/\#\#\{(?P<class>.+)\}\{(?P<args>.+)\}\#\#/i', чтобы сопоставить его, но моя проблема в том, что когда это регулярное выражение встречается несколько раз, потому что оно будет совпадать даже с текстом между двумя совпадающимипаттерны.

И это результат моего регулярного выражения ##{ClassName1}{arg1;arg2;arg3}## some other random ##{class2}{}##.

Есть ли более элегантный способ извлечь ##{class1}{arg1;arg2;arg3}## и ##{Class2}{]## из строки и заменить их выводомиз базовых классов?

Я использую это, чтобы заменить их выходными данными из Class1 и Class2 с аргументами между вторым набором {}


Примечание: если второй набориз {} пуст, что означает, что в класс не передаются аргументы с именем в первом наборе {}

1 Ответ

5 голосов
/ 30 апреля 2011

Проблема в том, что .+ является "жадным" - он будет потреблять все символы, которые он может, до тех пор, пока остальная часть шаблона все еще может разрешиться.

Грязное общее решение - это сделать .+?, который будет соответствовать наименьшему количеству символов, необходимых для удовлетворения остальной части шаблона, и будет работать в этом случае.

Но, как правило, предпочтительнее написать что-то более конкретное, чем .+ в любом случае.В вашем случае [^}]+ будет работать?То есть между символами { и } может быть любое количество символов, которые не являются закрывающими }.

...