我试图在 Java 中转义 RegExp 元字符。以下是我想要的:
INPUT STRING: "This is $ test"
OUTPUT STRING: "This is \$ test"
这是我目前正在做的,但它不起作用:
String inputStr= "This is $ test";
inputStr = inputStr.replaceAll("$","\\$");
但我得到错误的输出:
"This is $ test$"
你需要:
inputStr.replaceAll("\\$", "\\\\\\$");
要替换的字符串需要 2 个反斜杠,因为$在正则表达式中具有特殊含义。所以 $ 必须被转义,以获得: \$
,并且反斜杠本身必须在 java String: 中被转义"\\$"
。
替换字符串需要 6 个反斜杠,因为\和$在替换字符串中都有特殊含义:
因此,如果您的预期替换字符串是“\$”,您需要转义这两个字符中的每一个以获得:\\\$
,然后您需要使用的每个反斜杠 - 其中 3 个,1 个文字和 2 个用于转义 -也必须在java字符串:"\\\\\\$"
.
如您所说, $ 是正则表达式的保留字符。然后,你需要逃避它。您可以使用反斜杠字符来执行此操作:
inputStr.replaceAll("\\$", ...);
在替换中,$ 和 \ 字符也有特殊含义:
请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同;见 Matcher.replaceAll
然后,替换将是反斜杠字符和美元符号,它们都被“\”字符转义(在构建字符串时需要加倍):
inputStr.replaceAll("\\$", "\\\\\\$");
你必须放 6 个反斜杠,这样你才能逃脱反斜杠并逃脱 metachar:
inputStr.replaceAll("\\$","\\\\\\$");
replaceAll 的第一个参数实际上是一个正则表达式,而 $ 实际上意味着“匹配字符串的结尾”。您可以只使用替换,它不使用正则表达式,只是一个普通的字符串替换,在这种情况下实现您想要的。如果您想使用正则表达式,只需将第一个参数中的 $ 转义即可。