Ответ 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
как и ожидалось.