我正在尝试以下代码: -
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)
我无法弄清楚为什么会出现这种异常?
答案 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()方法。