使用正则表达式删除括号内的特定字符
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, ", "");
我有这样一行:
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, ", "");