“\\\\”。replaceAll(“\\\\”,“\\”)抛出java.lang.StringIndexOutOfBoundsException

Java中的以下代码片段:

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

抛出exception:

 java.lang.StringIndexOutOfBoundsException: String index out of range: 1 (NO_SOURCE_FILE:0) 

replaceAll上的javadoc确实包含了对反斜杠使用的警告,并建议使用Matcher.replaceAllMatcher.quoteReplacement 。 有没有人知道如何用一个反斜杠替换字符串中所有出现的两个反斜杠?

澄清

上面显示的实际文字只是一个例子,实际的字符串可以在不同的地方出现两次连续的反斜杠。

您可以使用String#replace()完成它: –

 "\\\\".replace("\\\\", "\\") 

String#replaceAllregex作为参数。 所以,你必须两次逃避backslash 。 一次用于Java ,然后用于Regex 。 所以,使用replaceAll的实际替换看起来像: –

 "\\\\".replaceAll("\\\\\\\\", "\\\\") 

但是你真的不需要replaceAll

试试这个:

 "\\\\".replaceAll("\\{2}", "\\") 

replaceAll()的第一个参数是正则表达式, {2}表示必须匹配恰好两次出现的char。

如果你想使用Matcher.replaeAll()那么你想要这样的东西:

 Pattern.compile("\\\\\\\\").matcher(input).replaceAll("\\\\"); 

如果你在替换字符串中有反斜杠,它将被视为转义字符,并且该方法将尝试读取下一个字符。这就是为什么它抛出StringIndexOutOfBoundsException。