Удалить скобки из строки с помощью java regex

Я хочу удалить скобки, используя регулярное выражение Java, но столкнулся с ошибкой No group 1, пожалуйста, просмотрите мой код и помогите мне.

public String find_parenthesis(String Expr){
        String s;
        String ss;
        Pattern p = Pattern.compile("\\(.+?\\)");
        Matcher m = p.matcher(Expr);
        if(m.find()){
            s = m.group(1);
            ss = "("+s+")";
            Expr = Expr.replaceAll(ss, s);
            return find_parenthesis(Expr);
        }
        else
            return Expr;
    }

и это моя главная:

public static void main(String args[]){
    Calculator c1 = new Calculator();
    String s = "(4+5)+6";
    System.out.println(s);
    s = c1.find_parenthesis(s);
    System.out.println(s);
}

Ответ 1

Самый простой способ - просто удалить все круглые скобки из строки, независимо от того, сбалансированы они или нет.

String replaced = "(4+5)+6".replaceAll("[()]", "");

Правильная обработка балансировки требует синтаксического анализа (или действительно уродливых RE, которые соответствуют только ограниченной глубине или "умности" с повторными заменами регулярных выражений). В большинстве случаев такая сложность является чрезмерной; простейшая вещь, которая могла бы работать, достаточно хороша.

Ответ 3

Вы получаете ошибку, потому что в вашем регулярном выражении нет групп, но я предлагаю вам использовать этот гораздо более простой однолинейный подход:

expr = expr.replaceAll("\\((.+?)\\)", "$1");

Ответ 4

Вы не можете сделать это с помощью регулярного выражения. Он не удалит совпадающие скобки, только первые левые и первые справа, а затем вы не сможете получить правильный результат из выражения. Вам нужен парсер для выражений. Посмотрите вокруг рекурсивных парсеров эспрессора спуска, алгоритма шунтирования Дэйкстры и т.д.

Ответ 5

Регулярное выражение определяет класс символов, состоящий из любого символа пробела (\ s, который экранируется как \s, потому что мы передаем строку), тире (экранировано, потому что тире означает что-то особенное в контексте символа классы) и круглые скобки. Попробуйте использовать его.

phoneNumber.replaceAll("[\\s\\-()]", "");

Ответ 6

Я знаю, что я очень поздно здесь. Но на всякий случай вы все еще ищете лучший ответ. Если вы хотите удалить как открытые, так и закрывающие скобки из строки, вы можете использовать очень простой способ:

String s = "(4+5)+6";
s=s.replaceAll("\\(", "").replaceAll("\\)","");

Если вы используете это:

s=s.replaceAll("()", "");

вы инструктируете код искать (), который отсутствует в вашей строке. Вместо этого вы должны попытаться удалить скобки отдельно.

Чтобы подробно объяснить, рассмотрите приведенный ниже код:

String s = "(4+5)+6";
String s1=s.replaceAll("\\(", "").replaceAll("\\)",""); 
System.out.println(s1);
String s2 = s.replaceAll("()", "");
System.out.println(s2);

Выход для этого кода будет:

4 + 5 + 6

(4 + 5) +6

Кроме того, используйте replaceAll, только если вам нужен regex. В других случаях replace работает отлично. См. Ниже:

String s = "(4+5)+6";
String s1=s.replace("(", "").replace(")","");

Вывод:

4 + 5 + 6

Надеюсь, это поможет!