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

3

我有一行代码如下:

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

我希望它看起来像这样:

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

我不能仅仅在", "上做替换,因为这样会删除括号外的这些实例。

我尝试了以下方法:

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

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

请问有人可以告诉我如何指定仅在括号内出现时删除“,”和“ ”(逗号-空格)?

4个回答

2

使用预查:

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

这个正则表达式的意思是“只在下一个括号字符是闭合括号时替换逗号和空格”。
一些测试代码:
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)

接受正确的答案,首先需要有Java特定的示例。谢谢! - AHungerArtist
你可能想在 [^(]* 中包含 ),因为它有可能扫描比所需更多的内容:[^()]*\\) - OnlineCop

2
最安全的方法是使用两个正则表达式:首先捕获所有 (...),从这些结果中删除所有逗号和可选空格。
对于您特定的情况,您可以搜索 , *([^()]*)(?=\)) 并替换为 \1,可以在此处查看
这可能存在边缘情况的问题,例如您希望删除括号中包含多个内容的情况(例如 (XA, YB, ZC))。
或者(不进行替换)搜索 , *(?=[^(]*\)) 并替换为 (nothing),可以在此处查看。这可以很好地处理多个 ,,但如果您嵌入了 (...) 字符,则会出现问题。

希望我能接受两个答案。谢谢你提供的链接和解释。 - AHungerArtist

1

您可以使用:

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)

1

由于要避免的逗号前面有一个闭合括号,而要匹配的逗号前面是一个字母,因此您可以使用简单的单词边界来实现:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接