Недавно я заметил, что String.replaceAll(regex, replacement) ведет себя очень странно, когда дело доходит до escape-символа "\" (слэш)
Например, рассмотрим строку с пути к файлу - String text = "E:\\dummypath"
и мы хотим заменить "\\" на "/".
text.replace("\\","/") дает результат "E:/dummypath", тогда как text.replaceAll("\\","/") вызывает исключение java.util.regex.PatternSyntaxException.
Если мы хотим реализовать ту же функциональность с replaceAll(), нам нужно записать ее как,
text.replaceAll("\\\\","/")
Одна заметная разница replaceAll() имеет свои аргументы как reg-ex, тогда как replace() имеет аргументы символьной последовательности!
Но text.replaceAll("\n","/") работает точно так же, как и его эквивалент char -последовательности text.replace("\n","/")
Копаем глубже: Еще более странное поведение можно наблюдать, когда мы пытаемся использовать другие входы.
Позволяет назначить text="Hello\nWorld\n"
Теперь,
text.replaceAll("\n","/"), text.replaceAll("\\n","/"), text.replaceAll("\\\n","/") все эти три дают одинаковый вывод Hello/World/
Java действительно перепутала с reg-ex наилучшим образом, я чувствую! Никакой другой язык, похоже, не имеет такого игривого поведения в регистре. Любая конкретная причина, почему Java испортилась так?