【问题标题】:Regular expression to replace content between parentheses ()正则表达式替换括号之间的内容 ()
【发布时间】:2011-04-12 13:34:43
【问题描述】:

我试过这段代码:

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

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

【问题讨论】:

  • 请注意,如果括号嵌套,经常提供的表达式:\(.*?\) 会失败。代替惰性点星,使用更精确的表达式:[^()]*。请参阅我的答案以获得更好的解决方案。

标签: java regex string replaceall


【解决方案1】:

试试:

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

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

【讨论】:

  • 如果没有嵌套括号,则可以正常工作。否则失败。
【解决方案2】:

首先,您要删除括号及其内容吗?尽管问题的标题表明否,但我假设您也希望删除括号。

其次,括号之间的内容可以包含嵌套匹配括号吗?此解决方案假定是。由于 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) 在上面的例子中。)这是一个 very 常见的正则表达式错误:当有更精确的表达式时不要使用点! 在这种情况下,“最里面”的一组匹配括号之间的内容由任何不是左括号或右括号的字符组成,(即使用:[^()]* 而不是:.*?) .

【讨论】:

  • 这绝对是一个绝妙的答案。 java 的正则表达式引擎由于缺乏对递归表达式的支持而再次咬了我:/
  • @ridgerunner 如果我有这样的东西怎么办:"stuff1 [foo1[bar1]foo2] stuff2 [bar2] stuff3"
  • @user3767784 - 你的问题是什么?您的字符串没有括号。如果您想匹配匹配的[square brackets] 而不是匹配括号,则只需修改正则表达式并将每个文字括号替换为文字方括号。 1.e. String re = "\\[[^\\[\\]]*\\]";
  • 自 3.8 起,Apache commons-lang 现在附带 RegexUtils,其中包括用于递归匹配的实用程序。
【解决方案3】:

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

【讨论】:

  • 上面的匹配 ".*?"是非贪婪的,它将匹配第一次出现的右括号。对于贪婪来说,它只是“.*”
  • @earcam:是的,谢谢,我已经发现并编辑了它。
【解决方案4】:

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

【讨论】:

  • 你不需要在字符类中转义括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2016-07-21
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多