3

因此,我遇到了一个很好的边缘情况,replaceAll如果替换字符串中有 $ 或 \,则对 String 执行 a 会阻塞。

为什么替换字符串不仅仅是替换与我指定的正则表达式匹配的替换?我在这里对正则表达式不了解什么?

引用Oracle Java 7 文档

公共字符串替换所有(字符串替换)

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

此方法首先重置此匹配器。然后它扫描输入序列以查找模式的匹配项。不属于任何匹配的字符直接附加到结果字符串;结果中的每个匹配都被替换字符串替换。替换字符串可能包含对捕获的子序列的引用,如 appendReplacement 方法。

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可以被视为对捕获的子序列的引用,并且反斜杠用于转义替换字符串中的文字字符。

4

4 回答 4

6

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

"\\$"

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

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

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

还有一个特殊的第零组:

"$0" // replace with the entire match
于 2013-06-05T14:52:45.360 回答
3

正如问题所说的那样:

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

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

将有效地将“一些”替换为“另一个”。(愚蠢的例子,但让您了解它的含义。)

于 2013-06-05T14:56:22.607 回答
2

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

请注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可以被视为对捕获的子序列的引用,并且反斜杠用于转义替换字符串中的文字字符。

用额外的斜线逃脱它们。

于 2013-06-05T14:52:41.013 回答
2

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

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

String regex = ...;
String input = ...;
String replacement = ...;
input.replaceAll(regex, Matcher.quoteReplacement(replacement));
于 2013-06-05T14:53:59.333 回答