replaceAll "/" с помощью File.separator

В Java, когда я это делаю:

    "a/b/c/d".replaceAll("/", "@");

Я вернусь

    [email protected]@[email protected]

Но когда я сделаю:

    "a/b/c/d".replaceAll("/", File.separator);

Он генерирует исключение StringIndexOutOfBoundsException, и я не знаю, почему. Я пробовал это посмотреть, но это было не очень полезно. Может кто-нибудь мне помочь?

Ответ 1

Он говорит это прямо там в документации:

Обратите внимание, что обратная косая черта (\) и знаки доллара ($) в заменяющей строке могут привести к тому, что результаты будут отличаться от того, будут ли они рассматриваться как буквальная строка замены; см. Matcher.replaceAll.

И в Matcher.replaceAll:

Обратите внимание, что обратная косая черта (\) и знаки доллара ($) в заменяющей строке могут привести к тому, что результаты будут отличаться от того, будут ли они рассматриваться как буквальная строка замены. Знаки доллара могут рассматриваться как ссылки на захваченные подпоследовательности, как описано выше, а обратные косые черты используются для исключения буквенных символов в заменяющей строке.

Что вам нужно сделать, так это избежать любых escape-символов, которые у вас есть в заменяющей строке, например, с помощью 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);
    }
}

Обратите внимание: я использую литерал \\ в sep вместо использования File.separator непосредственно, так как мой разделитель является UNIX - вы должны просто использовать:

s = s.replaceAll("/", Matcher.quoteReplacement(File.separator));

Эти результаты:

a\b\c\d

как и ожидалось.

Ответ 2

File.separator is \ on Windows, то есть; это беглый обратный слэш. Однако в заменяющей строке это означает нечто совершенно другое. Таким образом, вам придется избегать этого дважды, один раз для Java и один раз для замены строки.

Это должно работать:

"a/b/c/d".replaceAll("/", Matcher.quoteReplacement(File.separator));

Ответ 3

Попробуй это

    String str = "a/b/c/d";
    str = str.replace("/", File.separator);

Ответ 4

Попробуйте с str.replace('/', File.separatorChar)