所以我刚刚遇到了一个很好的边缘情况,如果替换字符串中包含$或\,那么在字符串上执行replaceAll
将会阻塞。
为什么替换String不仅仅是替换与我指示的正则表达式的匹配?我在这里对正则表达式的理解是什么?
引自Oracle Java 7 Documentation:
public String replaceAll(String replacement)
替换匹配的输入序列的每个子序列 具有给定替换字符串的模式。
此方法首先重置此匹配器。然后它扫描输入 序列寻找模式的匹配。不是的字符 任何匹配的一部分都直接附加到结果字符串;每 匹配由替换字符串替换为结果。该 替换字符串可能包含对捕获的子序列的引用 在appendReplacement方法中。
请注意替换中的反斜杠(\)和美元符号($) 字符串可能会导致结果与正确的结果不同 作为文字替换字符串处理。可以对待美元符号 作为对如上所述的捕获的子序列的引用,和 反斜杠用于替换替换中的文字字符 字符串。
答案 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));