3

我正在尝试以下代码:-

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)

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

4

3 回答 3

20

String.replaceAll最终使用(或等同于使用)Matcher.replaceAll,其中包括在文档中:

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

虽然您可以按照 AlexR 的回答转义反斜杠,但我强烈建议您replace改用:

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

replaceAll这更清楚,IMO -除非你真的通过正则表达式表达模式,否则不要使用。

另请注意,无论如何编写您的代码都是无操作的;字符串在 Java 中是不可变的,因此该replaceAll方法(和类似的方法)返回对经过修改的字符串的引用。

于 2012-06-04T07:32:58.667 回答
8

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

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

于 2012-06-04T07:30:39.987 回答
0

你也可以使用quoteReplacement()方法,以防你真的需要一个正则表达式。

于 2015-12-07T16:05:50.467 回答