这是"这里到底发生了什么"的问题.我实际上并不需要解决方案.
我不得不用双反斜杠替换String中的所有单个反斜杠.这就是我最终做的......
strRootDirectory = strRootDirectory.replaceAll("\\\\", "\\\\\\\\");
Run Code Online (Sandbox Code Playgroud)
...其中strRootDirectory是上面的java.lang.String.
现在,我理解第一个参数的四个反斜杠:正则表达式需要两个反斜杠以表示单个字面反斜杠,并且java希望它们加倍.没关系.
但是,第二个参数的八个反斜杠是怎么回事?是不是替换字符串应该是文字(非正则表达式,我的意思)字符串?我希望在第二个参数中需要四个反斜杠,以表示两个反斜杠.
第二个参数不是正则表达式字符串,而是正则表达式替换字符串,其中反斜杠也具有特殊含义(它用于转义$
用于变量插值的特殊字符,也用于转义自身).
来自API:
请注意,替换字符串中的反斜杠(
\
)和美元符号($
)可能会导致结果与将其视为文字替换字符串时的结果不同; 看Matcher.replaceAll
.使用Matcher.quoteReplacement(java.lang.String)
抑制这些字符的特殊含义,如果需要的话.- http://download.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll( ...)
如果你使用它会更容易replace("\\","\\\\")
(String.replace
采用文字字符串,当它全部是字面时更有效)
或者你可以通过Pattern.quote
和Matcher.quoteReplacement
功能确保正确性