6

我试过这段代码:

string.replaceAll("\\(.*?)","");

但它返回null。我错过了什么?

4

4 回答 4

18

尝试:

string.replaceAll("\\(.*?\\)","");

您没有逃脱第二个括号,也没有在第一个括号中添加额外的“\”。

于 2011-04-12T13:36:22.740 回答
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"

请注意,lazy-dot-star 解决方案永远不会起作用,因为当它们嵌套时,它无法匹配最里面的括号集。(即错误匹配:(foo1(bar1)在上面的示例中。)这是一个非常常见的正则表达式错误:当有更精确的表达式时,切勿使用点!在这种情况下,“最里面”的一组匹配括号之间的内容由任何不是左括号或右括号的字符组成(即使用:[^()]*而不是:).*?

于 2011-04-12T15:35:53.310 回答
2

试试string.replaceAll("\\(.*?\\)","")

于 2011-04-12T13:36:03.463 回答
1

string.replaceAll("\\([^\\)]*\\)",""); 这样你就说匹配一个括号,然后是所有非右括号字符,然后是一个右括号。这通常比不情愿或贪婪的 .* 匹配器更快。

于 2011-04-12T14:04:34.403 回答