14

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

6 回答 6

34

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

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

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

于 2013-03-31T11:30:33.250 回答
9

你想要的是这样的:s = s.replaceAll("[()]","");

有关正则表达式的更多信息,请访问正则表达式教程

于 2013-04-01T22:39:33.883 回答
4

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

expr = expr.replaceAll("\\((.+?)\\)", "$1");
于 2013-03-31T11:21:31.277 回答
1

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

于 2013-03-31T07:39:12.033 回答
1

正则表达式定义了一个字符类,它包含任何空白字符(\s,因为我们传入一个字符串,所以转义为 \s),一个破折号(转义是因为破折号在字符类的上下文中意味着特殊的东西),和括号。试试它的工作代码。

phoneNumber.replaceAll("[\\s\\-()]", "");
于 2013-08-14T10:09:07.183 回答
0

我知道我在这里很晚了。但是,以防万一您仍在寻找更好的答案。如果要从字符串中删除左括号和右括号,可以使用如下非常简单的方法:

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

希望这可以帮助!

于 2015-10-08T10:00:12.327 回答