Это правильно работает в вашем примере строки:
s = s.replaceAll("([^()]*(?:\\([^()]*\\)[^()]*)*)[()]", "$1");
Или, в более читаемой форме:
(
[^()]* # some non-parentheses
(?:
\([^()]*\) # a matched pair of parens
[^()]* # some more non-parens
)*
)
[()] # one unpaired paren
Я предполагаю, что вы не хотите разрешать вложенные парыскобки.Например, в этой строке:
"abc(def(ghi)jkl)mno"
... первый (
и последний )
должны быть удалены, оставляя это:
"abcdef(ghi)jklmno"
Если вы хотитечтобы разрешить вложение, не существует чистого решения регулярных выражений - по крайней мере, не в Java.