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

Remove specific characters inside parentheses using regex

我有这样一行:

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

我希望它看起来像这样:

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

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

我试过这个:

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

替换括号内的 一切 (不仅仅是逗号)。我试图只将逗号和 space 组合添加到该正则表达式中,但它似乎并没有删除任何东西。

有人可以告诉我如何指定仅在 括号内 出现时删除 ", "(逗号-space)吗?

您可以使用:

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)

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

对于您的具体情况,您可以搜索 , *([^()]*)(?=\)) 并替换为 </code>,您可以 <a href="https://regex101.com/r/gH6dK3/1" rel="nofollow">see here</a>。</p> <p>这可能会遇到边缘情况的问题,在这些情况下,您希望删除括号内的多个内容(例如 <code>(XA, YB, ZC))。

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

使用前瞻:

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

这个正则表达式表示 "replace the comma-space only when the next bracket character is a close bracket"


一些测试代码:

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)

您可以使用简单的单词边界来做到这一点,因为您要避免的逗号前面有一个右括号,而您想要匹配的逗号前面有一个字母:

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