In Java, when I do:
"a/b/c/d".replaceAll("/", "@");
I get back
a@b@c@d
But when I do:
"a/b/c/d".replaceAll("/", File.separator);
It throws a StringIndexOutOfBoundsException, and I don't know why. I tried looking this up, but it wasn't very helpful. Can anyone help me out?
It says it right there in the documentation:
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see
Matcher.replaceAll
.
And, in Matcher.replaceAll
:
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string. Dollar signs may be treated as references to captured subsequences as described above, and backslashes are used to escape literal characters in the replacement string.
What you need to do is to escape any escape characters you have in the replacement string, such as with Matcher.quoteReplacement()
:
import java.io.File;
import java.util.regex.Matcher;
class Test {
public static void main(String[] args) {
String s = "a/b/c/d";
String sep = "\\"; // File.separator;
s = s.replaceAll("/", Matcher.quoteReplacement(sep));
System.out.println(s);
}
}
Note, I'm using the literal \\
in sep
rather than using File.separator
directly since my separator is the UNIX one - you should be able to just use:
s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));
This outputs:
a\b\c\d
as expected.