Недавно я заметил, что 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 испортилась так?