Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

replaceAll "/" with File.separator

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?

like image 324
tomato Avatar asked Dec 05 '12 01:12

tomato


4 Answers

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.

like image 151
paxdiablo Avatar answered Oct 01 '22 18:10

paxdiablo


Try This

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);
like image 34
Smit Avatar answered Oct 01 '22 18:10

Smit


File.separator is \ on Windows, that is; it is an escaped backslash. However, in a replacement string, it means something completely different. So you'd have to escape it twice, once for Java, and once for replacement string.

This should work:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));
like image 22
nullpotent Avatar answered Sep 30 '22 18:09

nullpotent


Try with str.replace('/', File.separatorChar)

like image 44
fmartelli Avatar answered Oct 02 '22 18:10

fmartelli