我想使用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);
}
答案 0 :(得分:24)
最简单的方法是从字符串中删除所有括号,无论它们是否平衡。
String replaced = "(4+5)+6".replaceAll("[()]", "");
正确处理平衡需要解析(或者真正丑陋的RE只与有限的深度匹配,或者“聪明”与重复的正则表达式替换)。在大多数情况下,这种复杂性是过度的;可能最简单的事情就是足够好。
答案 1 :(得分:9)
你想要的是:s = s.replaceAll("[()]","");
有关正则表达式的更多信息,请访问regex tutorial。
答案 2 :(得分:4)
您收到错误是因为您的正则表达式没有任何组,但我建议您使用这种更简单的单行方法:
expr = expr.replaceAll("\\((.+?)\\)", "$1");
答案 3 :(得分:1)
你根本不能使用正则表达式。它不会删除匹配的括号,只是第一个左边和右边第一个,然后你将无法从表达式中获得正确的结果。表达式需要解析器。浏览递归下降ezpresssion解析器,Dijkstra shunting-yard算法等。
答案 4 :(得分:1)
正则表达式定义了一个由任何空格字符组成的字符类(\ s,因为我们传入一个字符串而被转义为\ s,因为我们传入一个字符串),一个破折号(因为短划线意味着在字符的上下文中有特殊的东西)课程)和括号。试试工作代码。
phoneNumber.replaceAll("[\\s\\-()]", "");
答案 5 :(得分:-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
此外,仅在您需要replaceAll
时才使用regex
。在其他情况下,replace
工作正常。见下文:
String s = "(4+5)+6";
String s1=s.replace("(", "").replace(")","");
输出:
4 + 5 + 6
希望这有帮助!