Вы можете сделать это эффективно с регулярным выражением + рекурсия. Сделайте это, пока он не перестанет делать что-нибудь:
s/\(\([^()]*)\)\)/\(\1\)/g
Теперь некоторые комментарии:
1) Я оставляю это вам конвертировать/стиль патч в PERL в PHP стиль регулярных выражений.
2) Трудно читать, потому что() являются специальными символами. В основном я говорю: «Заменяйте каждый ((...))
(...)
, пока ...
не содержит (
или )
. И, честно говоря, я не проверял беспорядок, который я записал, но с этой идеей вы должны иметь возможность ремонта.
Это всегда удаляет их в парах
в основном нравственную здесь:.. вы задали вопрос, который вы не можете сделать с помощью простого регулярного выражения - удаление в паре требует больше, чем состояния разрешений языка Но эта низко висящие фрукты, если вы перебираете простое регулярное выражение и кушаете дублеты от наизнанку.
T o какие правила замены? Соответствующие круглые скобки или просто свертывание последовательных открытий или закрытий parens? - Кроме того, вы еще что-то пробовали? – mario
Как насчет '((fo (o)) ((bar)))' и '(((((foo)'? – Qtax