使用java正则表达式从字符串中删除括号

使用java正则表达式从字符串中删除括号,java,regex,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()){

我想使用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);
}

你根本不能用正则表达式来做这件事。它不会删除匹配的括号,只删除第一个左括号和第一个右括号,然后您将无法从表达式中获得正确的结果。您需要表达式的解析器。查看一下递归下降EzPression解析器、Dijkstra调车场算法等。

您会遇到错误,因为您的正则表达式没有任何组,但我建议您使用更简单的单行方法:

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

最简单的方法是从字符串中删除所有括号,不管它们是否平衡

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

正确处理平衡需要解析(或者只匹配有限深度的真正丑陋的REs,或者重复正则表达式替换的“聪明”)。在大多数情况下,这种复杂性是过分的;最简单的事情可能就是足够好了。

你想要的是:
s=s.replaceAll(“[()]”,“)


有关正则表达式的详细信息,请访问。

正则表达式定义了一个字符类,该类由任何空白字符(\s,因为我们在字符串中传递,所以转义为\s)、破折号(转义是因为破折号在字符类上下文中表示特殊的内容)和括号组成。试试它的工作代码

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

我知道我来晚了。但是,以防万一你还在寻找更好的答案。如果要从字符串中删除开括号和闭括号,可以使用以下非常简单的方法:

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

此外,仅当您需要
regex
时才使用
replaceAll
。在其他情况下,
replace
可以正常工作。见下文:

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

4+5+6


希望这有帮助

为了捕获一个组,您需要在正则表达式中有一对未替换的括号。但是,假设您做了这个更改,代码的其余部分只是将括号放回原处,不是吗?为什么需要正则表达式呢?@KennethK。我需要它来进行公式解析,您可以使用它,或者Java的任何其他数学解析库。好的,但我再次问:为什么您需要一个正则表达式来简单地替换一个或多个括号?我可以很好地完成这项工作。我的括号没有嵌套,但谢谢你的帮助answer@Ehsan如果您完全控制输入,正如您必须能够断言的那样,我完全不理解您为什么需要表达式分析器。无论如何,我的意见是正确的。您需要表达式的解析器。临时方法将不起作用。你这样做是不对的。当您处理运算符优先级时,问题将再次出现。把它做好。真的没有其他选择。是的,在任何情况下,你的评论解析我的方式是站着的,我从来没有说在公式解析中我的方式是正确的,但只有我在正则表达式上遇到错误,我要求解决这个问题it@Ehsan解决方案不变。用正确的方法而不是错误的方法解决整个问题。像鸵鸟一样把头埋在沙子里是不行的。如果您不希望使用嵌套括号,那么为什么代码是递归的呢?@downvoter这是形式语言的一个基本事实,已经有60年的历史了。看见