Удаление фрагмента в круглых скобках, учитывая, что они могут быть вложенными

Дано задание: "Удалить из текста все фрагменты в круглых скобках (и сами скобки). Учесть, что скобки могут быть вложенными".

У меня есть данное решение:

String str = textArea1.getText();
str = str.replaceAll("\\(.*?\\) ?", "");

Оно прекрасно справляется с удалением текста в скобках, но не работает, когда речь идёт о вложенных. Т.е в примере "Это текстовая строка (пример (вложенная скобка))" на выходе я получаю "Это текстовая строка )".


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

import java.util.*;
import java.util.regex.*;

class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String str = "Это текстовая строка (пример (вложенная скобка))";
        String regex = "\\s*\\([^()]*\\)";
        String tmp = "";
        do {
            tmp = str;
            str = str.replaceAll(regex, "");
        } while (!str.equals(tmp));
        System.out.println(str);
    }
}

См. пример работы кода.

Подробности

  • \s*\([^()]*\) находит ноль и более пробельных символов, (, ноль и более символов, отличных от круглых скобок, )
  • tmp хранит предыдущее значение str
  • пока str не равно tmp, происходит удаление найденных подстрок и данной строки.
→ Ссылка