2012-06-14 38 views
2

我想逃避Java中的RegExp元字符。下面是我想:转义Java RegExp元字符

这是目前我在做什么,但它不工作:

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

但我发现了错误的输出:

"This is $ test$" 
+1

只需使用'replace'替代replaceAll即可。它会工作,并且会更有效率。 – jahroy

回答

3

你需要:

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

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

替换字符串需要6个反斜线,因为这两个\$必须在替换字符串的特殊含义:

  • \可以用来逃生替换字符串中的字符。
  • $可用于在替换字符串中进行反向引用。

因此,如果您打算替换字符串是“\ $”,你需要逃避每个这两个字符来获得:\\\$,然后你需要使用的每个反斜杠 - 其中3,1字面和2逃脱 - 必须内java字符串转义:"\\\\\\$"

参见:Matcher.replaceAll

0

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

1

你必须把6个反斜杠,所以你转义反斜线和逃脱元字符:

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

1

正如你所说,$是正则表达式保留字符。那么,你需要逃避它。你可以用一个反斜杠字符来做到这一点:

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

在更换时,$和\字符也有特殊的意义:

注意,反斜杠()和美元符号($)替换字符串可能会导致结果不同,如果它被视为字面替换字符串;看Matcher。的replaceAll

然后,替换将是反斜线字符和美元符号,两者由一个“\”字符被转义(这需要加倍TOI构建字符串):

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