2013-03-31 189 views
12

我想删除使用Java正则表达式的括号,但我遇到了错误No group 1请看我的代码并帮助我。使用java正则表达式从字符串中删除括号

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); 
} 
+0

为了捕获一个组,你需要在你的正则表达式中有一对未转义的圆括号。然而,假设你做了这个改变,剩下的代码只是重新放回括号,不是吗? –

+0

为什么你需要这个正则表达式? –

+0

@KennethK。我需要它来进行公式分析 – Ehsan

回答

1

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

+0

我的括号不是嵌套的,但是谢谢你的回答 – Ehsan

+0

@Ehsan如果你完全控制了输入,你必须能够断言,我不明白你为什么需要表达分析器。在任何情况下,我的评论站在。你需要一个表达式解析器。临时方法不起作用。你这样做是错误的。当你处理操作符优先级时,问题会重新出现。做对了。真的没有其他选择。 – EJP

+0

是的,无论如何,你的评论解析我的方式是站立,我从来没有说过在公式解析我的方式是正确的,但只有我面临正则表达式的错误,我问问题解决它 – Ehsan

2

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

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

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

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

正确处理平衡需要解析(或真正难看的RE仅匹配到有限的深度,或“聪明”反复正则表达式取代)。在大多数情况下,这种复杂性是过度的;最简单的事情可能会起作用。

9

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

更多关于正则表达式,请访问:regex tutorial

1

正则表达式定义了一个由任何空格字符组成的字符类(\ s,它被转义为\ s因为我们传入一个字符串),一个破折号(由于破折号意味着在字符类)和括号。试试它的工作代码。

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

我知道我在这里很晚。但是,以防万一你还在寻找更好的答案。如果您在使用本

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

另外,仅当您需要时才使用。在其他情况下,replace工作得很好。请看下图:

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

输出:

4 + 5 + 6

希望这有助于!

相关问题