我有这样一句话:
BlockedMatch(XA, YB), Correlation(XA, QC), Correlation(YB, QC), Correlation(QC, YB)
我希望它看起来像这样:
BlockedMatch(XAYB), Correlation(XAQC), Correlation(YBQC), Correlation(QCYB)
我不能只对“,”进行替换,因为它会删除括号外的那些实例。
我试过了:
replaceAll("\\((.*?)\\)", "")
替换括号内的所有(不仅仅是逗号)。我试图将逗号和空格组合添加到该正则表达式中,但它似乎没有删除任何内容。
有人可以告诉我如何指定仅在括号内发生时删除", "
(逗号空格)吗?
答案 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)