用双反斜杠替换单反斜杠需要8个反斜杠?

这是“这里到底发生了什么”的问题。 我实际上并不需要解决方案。

我不得不用双反斜杠替换String中的所有单个反斜杠。 这就是我最终做的……

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

…其中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.quoteMatcher.quoteReplacement函数确保正确性

"\\\\\\\\"导致在内存中表示带有4个反斜杠的字符串: \\\\ 。 虽然第二个字符串不是正则表达式字符串,但反斜杠和美元符号仍然是特殊字符,因此需要对其进行转义。

根据Java参考资料,replaceAll方法也将替换字符串中的反斜杠解释为转义字符。 它们可以用来转义美元符号字符,它可以引用匹配的表达式在替换字符串中重用。 所以很自然地,如果你想将反斜杠的数量加倍,并且两个参数都将反斜杠视为转义字符,则替换字符串中需要两倍的反斜杠。

是的,当你需要做这种事情时会变得毛茸茸,不是吗。

你需要这么多反斜杠的原因是你需要考虑反斜杠用于转义字符串和转义正则表达式。

  • 拿1个反斜杠。
  • 将它加倍以进行字符串转义。
  • 为正则表达式转义再加倍。
  • 再次加倍,因为您需要在原始字符串中匹配两个连续的反斜杠。

那就是8。

作为没有深入详细解释正则表达式的粉丝……我从Bart Kiers的主要答案post中发现:

 System.out.println( "line1: "+"hello\\\\world" ); System.out.println( "line2: "+"hello\\\\world".replaceAll("\\\\\\\\", Matcher.quoteReplacement("\\") ) ); 

打印出来

 line1: hello\\world line2: hello\world 

我希望它有帮助……