I can't figure out why the following code doesn't behave as expected
"Hello/You/There".replaceAll("/", "\\/");
Expected output: Hello\/You\/There
Actual output: Hello/You/There
Do I need to escape forward slashes? I didn't think so but I also tried the following against my will ... didn't work
"Hello/You/There".replaceAll("\\/", "\\/");
In the end I realized I don't need a regular expression and I can just use the following, which doesn't create a regular expression
"Hello/You/There".replace("/", "\\/");
However, I'd still like to understand why my first example doesn't work.
解决方案
The problem is actually that you need to double-escape backslashes in the replacement string. You see, "\\/" (as I'm sure you know) means the replacement string is \/, and (as you probably don't know) the replacement string \/ actually just inserts /, because Java is weird, and gives \ a special meaning in the replacement string. (It's supposedly so that \$ will be a literal dollar sign, but I think the real reason is that they wanted to mess with people. Other languages don't do it this way.) So you have to write either:
"Hello/You/There".replaceAll("/", "\\\\/");
or:
"Hello/You/There".replaceAll("/", Matcher.quoteReplacement("\\/"));