Предполагая, что скобки не нужно соединять, например, ((((5))
должно стать (5)
, тогда будет делать следующее:
str = str.replaceAll("([()])\\1+", "$1");
Тест
for (String str : new String[] { "(5)", "((5))", "((((5))))", "((((5))" }) {
str = str.replaceAll("([()])\\1+", "$1");
System.out.println(str);
}
Выход
(5)
(5)
(5)
(5)
Объяснение
( Start capture group
[()] Match a '(' or a ')'. In a character class, '(' and ')'
has no special meaning, so they don't need to be escaped
) End capture group, i.e. capture the matched '(' or ')'
\1+ Match 1 or more of the text from capture group #1. As a
Java string literal, the `\` was escaped (doubled)
$1 Replace with the text from capture group #1
См. Также regex101.com для демонстрации.