使用正则表达式删除括号内的特定字符

时间:2015-04-13 16:40:21

标签: java regex string replace pattern-matching

我有这样一句话:

BlockedMatch(XA, YB), Correlation(XA, QC), Correlation(YB, QC), Correlation(QC, YB)

我希望它看起来像这样:

BlockedMatch(XAYB), Correlation(XAQC), Correlation(YBQC), Correlation(QCYB)

我不能只对“,”进行替换,因为它会删除括号外的那些实例。

我试过了:

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

替换括号内的所有(不仅仅是逗号)。我试图将逗号和空格组合添加到该正则表达式中,但它似乎没有删除任何内容。

有人可以告诉我如何指定仅在括号内发生时删除", "(逗号空格)吗?

4 个答案:

答案 0 :(得分:2)

最安全的方法是使用两个正则表达式:首先,捕获所有(...),然后从这些结果中删除所有逗号和可选空格。

针对您的具体情况,您可以搜索, *([^()]*)(?=\))并替换为您see here\1

如果您希望删除括号中的多个内容(例如(XA, YB, ZC)),则边缘情况可能会出现问题。

或(不替换)搜索, *(?=[^(]*\))并替换为您see here(nothing)。这会很好地处理多个,,但如果您嵌入了(...)个字符,则会出现问题。

答案 1 :(得分:2)

使用前瞻:

str = str.replaceAll(", (?=[^(]*\\))", "");

此正则表达式“仅当下一个括号字符是<​​em> close 括号时才替换逗号空间”


一些测试代码:

String str = "BlockedMatch(XA, YB), Correlation(XA, QC), Correlation(YB, QC), Correlation(QC, YB)";
str = str.replaceAll(", (?=[^(]*\\))", "");
System.out.println(str);

输出:

BlockedMatch(XAYB), Correlation(XAQC), Correlation(YBQC), Correlation(QCYB)

答案 2 :(得分:1)

你可以用一个简单的单词边界来完成它,因为你要避免的逗号前面有一个右括号,你想要匹配的逗号前面有一个字母:

str = str.replaceAll("\\b, ", "");

答案 3 :(得分:0)

您可以使用:

String s = "BlockedMatch(XA, YB), Correlation(XA, QC), Correlation(YB, QC), Correlation(QC, YB)";
Pattern p = Pattern.compile("(\\([^)]+\\))");
Matcher mat = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (mat.find()) {
    mat.appendReplacement(sb, mat.group(1).replaceAll(" *, *", ""));
}
mat.appendTail(sb);
System.out.println(sb);

<强>输出:

BlockedMatch(XAYB), Correlation(XAQC), Correlation(YBQC), Correlation(QCYB)