我试过这段代码:
string.replaceAll("\\(.*?)","");
但它返回null。我错过了什么?
答案 0 :(得分:15)
尝试:
string.replaceAll("\\(.*?\\)","");
你没有逃避第二个括号,你没有在第一个括号中添加额外的“\”。
答案 1 :(得分:11)
首先,您是否要删除括号及其内容?虽然问题的标题表明没有,但我假设您也希望删除括号。
其次,括号内的内容可以包含嵌套的匹配括号吗?该解决方案假定为是。由于Java正则表达式不支持递归表达式,因此解决方案是首先创建一个匹配“最里面”括号集的正则表达式,然后以迭代方式应用此正则表达式,从内到外替换它们。这是一个经过测试的Java程序,它正确地删除(可能是嵌套的)括号及其内容:
import java.util.regex.*;
public class TEST {
public static void main(String[] args) {
String s = "stuff1 (foo1(bar1)foo2) stuff2 (bar2) stuff3";
String re = "\\([^()]*\\)";
Pattern p = Pattern.compile(re);
Matcher m = p.matcher(s);
while (m.find()) {
s = m.replaceAll("");
m = p.matcher(s);
}
System.out.println(s);
}
}
测试输入:
"stuff1 (foo1(bar1)foo2) stuff2 (bar2) stuff3"
测试输出:
"stuff1 stuff2 stuff3"
请注意,懒惰点星解决方案永远不会起作用,因为它在嵌套时无法匹配最里面的圆括号。 (即它在上面的示例中错误地匹配:(foo1(bar1)
。)这是非常常见的正则表达式错误:当有更精确的表达式时,切勿使用点! / strong>在这种情况下,“最里面”的一组匹配括号之间的内容由任何不是开括号或右括号的字符组成(即使用:[^()]*
代替: .*?
)。
答案 2 :(得分:2)
尝试string.replaceAll("\\(.*?\\)","")
。
答案 3 :(得分:1)
string.replaceAll("\\([^\\)]*\\)","");
这样你就是说匹配一个括号,然后是所有非关闭括号字符,然后是一个右括号。这通常比不情愿或贪婪更快。*匹配。