2

我试图在 Java 中转义 RegExp 元字符。以下是我想要的:

INPUT STRING: "This is $ test"
OUTPUT STRING: "This is \$ test"

这是我目前正在做的,但它不起作用:

String inputStr= "This is $ test";
inputStr = inputStr.replaceAll("$","\\$");

但我得到错误的输出:

"This is $ test$"
4

4 回答 4

3

你需要:

inputStr.replaceAll("\\$", "\\\\\\$");

要替换的字符串需要 2 个反斜杠,因为$在正则表达式中具有特殊含义。所以 $ 必须被转义,以获得: \$,并且反斜杠本身必须在 java String: 中被转义"\\$"

替换字符串需要 6 个反斜杠,因为\$在替换字符串中都有特殊含义:

  • \ 可用于转义替换字符串中的字符。
  • $ 可用于在替换字符串中进行反向引用。

因此,如果您的预期替换字符串是“\$”,您需要转义这两个字符中的每一个以获得:\\\$,然后您需要使用的每个反斜杠 - 其中 3 个,1 个文字和 2 个用于转义 -必须在java字符串:"\\\\\\$".

请参阅:Matcher.replaceAll

于 2012-06-14T21:39:54.747 回答
1

如您所说, $ 是正则表达式的保留字符。然后,你需要逃避它。您可以使用反斜杠字符来执行此操作:

inputStr.replaceAll("\\$", ...);

在替换中,$ 和 \ 字符也有特殊含义:

请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;见 Matcher.replaceAll

然后,替换将是反斜杠字符和美元符号,它们都被“\”字符转义(在构建字符串时需要加倍):

inputStr.replaceAll("\\$", "\\\\\\$");
于 2012-06-14T21:50:25.100 回答
1

你必须放 6 个反斜杠,这样你才能逃脱反斜杠并逃脱 metachar:

inputStr.replaceAll("\\$","\\\\\\$");

于 2012-06-14T21:39:57.307 回答
0

replaceAll 的第一个参数实际上是一个正则表达式,而 $ 实际上意味着“匹配字符串的结尾”。您可以只使用替换,它不使用正则表达式,只是一个普通的字符串替换,在这种情况下实现您想要的。如果您想使用正则表达式,只需将第一个参数中的 $ 转义即可。

于 2012-06-14T21:35:12.673 回答