Давайте ознакомимся с String#repalceAll(регулярное выражение строки, замена строки)
Вы увидите, что:
Вызов этого метода формы str.replaceAll(regex, repl) дает точно такой же результат, как и выражение
Pattern.compile(regex).matcher(str).replaceAll(repl)
Итак, давайте взглянем на Matcher.html#replaceAll(java.lang.String) документация
Обратите внимание, что обратная косая черта (\
) и знаки доллара ($
) в замещающей строке могут привести к тому, что результаты будут другими, чем если бы она рассматривалась как буквальная заменяющая строка. Знаки доллара могут рассматриваться как ссылки на захваченные подпоследовательности, как описано выше, а обратная косая черта используется для экранирования буквенных символов в строке замены.
Вы можете видеть, что в replacement
у нас есть специальный символ $
, который можно использовать как ссылку на захваченную группу, например
System.out.println("aHellob,aWorldb".replaceAll("a(\\w+?)b", "$1"));
// result Hello,World
Но иногда мы не хотим, чтобы $
был таким особенным, потому что мы хотим использовать его как простой символ доллара, поэтому нам нужен способ избежать его.
А вот и \
, поскольку он используется для экранирования метасимволов в регулярных выражениях. , строки и, возможно, в других местах, это хорошее соглашение, чтобы использовать его здесь, чтобы экранировать $
.
Итак, теперь \
также является метасимволом в замещающей части, поэтому, если вы хотите сделать его простым литералом \
в замене, вам нужно как-то избежать его. И угадайте, что? Вы экранируете его так же, как вы экранируете его в регулярном выражении или строке. Вам просто нужно поместить еще один \
перед тем, который вы убегаете.
Поэтому, если вы хотите создать \
в замещающей части, вам нужно добавить перед ней еще \
. Но помните, что для записи литерала \
в String вам нужно записать его как "\\"
, поэтому для создания двух \\
взамен вам нужно записать его как "\\\\"
.
Поэтому постарайтесь
s = s.replaceAll("'", "\\\\'");
Или даже лучше
чтобы уменьшить явное экранирование в замещающей части (а также в части регулярных выражений - забыл упомянуть об этом ранее), просто используйте replace
вместо replaceAll
, что добавляет экранирование регулярных выражений для нас
s = s.replace("'", "\\'");
person
Pshemo
schedule
13.12.2013
"You are 'awesome'\'amazing'"
, вы в настоящее время получите"You are \'awesome\'\\'amazing\'"
. Это оставляет третью кавычку без экранирования, потому что введенная пользователем обратная косая черта экранирует сгенерированный после нее обратный слэк! - person tobii   schedule 21.12.2013