这是“这里到底发生了什么”的问题。我实际上并不需要解决方案。
我不得不用双反斜杠替换String中的所有单个反斜杠。这就是我最终做的......
strRootDirectory = strRootDirectory.replaceAll("\\\\", "\\\\\\\\");
...其中strRootDirectory是上面的java.lang.String。
现在,我理解第一个参数的四个反斜杠:正则表达式需要两个反斜杠以表示单个字面反斜杠,而java希望它们加倍。没关系。
但是,第二个参数的八个反斜杠是怎么回事?是不是替换字符串应该是文字(非正则表达式,我的意思)字符串?我希望在第二个参数中需要四个反斜杠,以表示两个反斜杠。
答案 0 :(得分:8)
第二个参数不是正则表达式字符串,而是正则表达式替换字符串,其中反斜杠也具有特殊含义(它用于转义用于变量插值的特殊字符$
和也用来逃避自己)。
来自API:
请注意,替换字符串中的反斜杠(
\
)和美元符号($
)可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll
。如果需要,使用Matcher.quoteReplacement(java.lang.String)
来抑制这些字符的特殊含义。- http://download.oracle.com/javase/6/docs/api/java/lang/String.html#replaceAll(...)
答案 1 :(得分:6)
如果您使用replace("\\","\\\\")
(String.replace
接受文字字符串,并且在全部字面值时效率更高),则会更容易。
或者您可以通过Pattern.quote
和Matcher.quoteReplacement
函数
答案 2 :(得分:2)
"\\\\\\\\"
会导致内存表示带有4个反斜杠的字符串:\\\\
。虽然第二个字符串不是正则表达式字符串,但反斜杠和美元符号仍然是特殊字符,因此需要对它们进行转义。
答案 3 :(得分:1)
根据Java参考资料,replaceAll方法也将替换字符串中的反斜杠解释为转义字符。它们可以用来转义美元符号字符,它可以引用匹配的表达式在替换字符串中重用。所以很自然地,如果你想要将反斜杠的数量加倍,并且两个参数都将反斜杠视为转义字符,则替换字符串中需要两倍的反斜杠。
答案 4 :(得分:1)
是的,当你需要做这种事情时会变得毛茸茸,不是吗。
你需要这么多反斜杠的原因是你需要考虑反斜杠用于转义字符串和转义正则表达式。
那就是8。
答案 5 :(得分:1)
作为没有深入详细解释正则表达式的粉丝......我从上面的Bart Kiers的主要答案中找到了:
System.out.println( "line1: "+"hello\\\\world" );
System.out.println( "line2: "+"hello\\\\world".replaceAll("\\\\\\\\", Matcher.quoteReplacement("\\") ) );
打印出来
line1: hello\\world
line2: hello\world
我希望它有所帮助...