Matcher.replaceAll - 在$,\ Ch替换字符串

时间:2013-06-05 14:50:01

标签: java regex

所以我刚刚遇到了一个很好的边缘情况,如果替换字符串中包含$或\,那么在字符串上执行replaceAll将会阻塞。

为什么替换String不仅仅是替换与我指示的正则表达式的匹配?我在这里对正则表达式的理解是什么?

引自Oracle Java 7 Documentation

  

public String replaceAll(String replacement)

     

替换匹配的输入序列的每个子序列   具有给定替换字符串的模式。

     

此方法首先重置此匹配器。然后它扫描输入   序列寻找模式的匹配。不是的字符   任何匹配的一部分都直接附加到结果字符串;每   匹配由替换字符串替换为结果。该   替换字符串可能包含对捕获的子序列的引用   在appendReplacement方法中。

     

请注意替换中的反斜杠(\)和美元符号($)   字符串可能会导致结果与正确的结果不同   作为文字替换字符串处理。可以对待美元符号   作为对如上所述的捕获的子序列的引用,和   反斜杠用于替换替换中的文字字符   字符串。

4 个答案:

答案 0 :(得分:6)

美元符号是一个特殊字符;你必须逃脱它:

"\\$"

注意双反斜杠 - 这是你在java中编写单个反斜杠的方式,这意味着\$被传递给replace方法。

美元符号表示对捕获组的反向引用:

"$1" // replace with group 1
"$2" // replace with group 2

还有一个特殊的第0组:

"$0" // replace with the entire match

答案 1 :(得分:2)

这有点好笑,但你的引用包含答案(他们说一个好问题的答案有一半。确实;)。

  

请注意替换中的反斜杠(\)和美元符号($)   字符串可能会导致结果与正确的结果不同   作为文字替换字符串处理。可以对待美元符号   作为对如上所述的捕获的子序列的引用,和   反斜杠用于替换替换中的文字字符   字符串。

用额外的斜线逃脱它们。

答案 2 :(得分:2)

正如问题所述:

引用输入中的捕获组,替换字符串可以包含您匹配的任何内容:

replaceAll("some str(ing)", "another str$1");

将有效地将“some”替换为“another”。 (愚蠢的例子,但是要让你知道它意味着什么。)

答案 3 :(得分:0)

因为$可用于对匹配的字符串(或匹配字符串的组)进行反向引用,\可用于禁用该行为。

如果要使用简单的非正则表达式字符串替换,请使用Matcher.quoteReplacement()

String regex = ...;
String input = ...;
String replacement = ...;
input.replaceAll(regex, Matcher.quoteReplacement(replacement));