String.replaceAll()函数出错

时间:2012-06-04 07:29:30

标签: java

我正在尝试以下代码: -

String x = "asdfg/dgws";
x.replaceAll("/", "\\");

但这是失败的。这给了我以下错误消息: -

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
    at java.lang.String.charAt(Unknown Source)
    at java.util.regex.Matcher.appendReplacement(Unknown Source)
    at java.util.regex.Matcher.replaceAll(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at com.jai.SecLargest.main(SecLargest.java:13)

我无法弄清楚为什么会出现这种异常?

3 个答案:

答案 0 :(得分:20)

String.replaceAll最终使用(或等同于使用)Matcher.replaceAll,其中包含以下内容:

  

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

虽然您可以按照AlexR的回答逃避反斜杠,但我强烈建议您改为使用replace

String y = x.replace('/', '\\');

这更加清晰,IMO - 不要使用replaceAll,除非您真的尝试通过正则表达式表达模式。

另请注意,以书面形式您的代码无论如何都是无操作的;字符串在Java中是不可变的,因此replaceAll方法(以及类似的方法)返回对 new 字符串的引用以及修改。

答案 1 :(得分:8)

你应该说x.replaceAll("/", "\\\\");

反斜杠\必须转义两次:一次是正则表达式引擎,一次是java本身。

答案 2 :(得分:0)

如果您确实需要正则表达式,也可以使用quoteReplacement()方法。