Java: Заменить все 'в строке с помощью'
Мне нужно избежать всех кавычек (') в строке, поэтому она становится \
Я пытался использовать replaceAll, но он ничего не делает. По какой-то причине я не могу заставить регулярное выражение работать.
Я пытаюсь с
String s = "You'll be totally awesome, I'm really terrible";
String shouldBecome = "You\'ll be totally awesome, I\'m really terrible";
s = s.replaceAll("'","\\'"); // Doesn't do anything
s = s.replaceAll("\'","\\'"); // Doesn't do anything
s = s.replaceAll("\\'","\\'"); // Doesn't do anything
Я действительно застрял здесь, надеюсь, что кто-то может мне помочь здесь.
Спасибо,
Айван
Ответы
Ответ 1
Вы должны сначала скрыть обратную косую черту, потому что это буквальный (уступающий \\
), а затем снова избегайте его из-за регулярного выражения (дающего \\\\
). Итак, попробуйте:
s.replaceAll("'", "\\\\'");
выход:
You\'ll be totally awesome, I\'m really terrible
Ответ 2
Используйте replace()
s = s.replace("'", "\\'");
выход:
Ты будешь совершенно потрясающим, я действительно ужасен
Ответ 3
Познакомьтесь с String # repalceAll (регулярное выражение String, замена строки)
Вы увидите, что:
Вызов этого метода формы 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
Но иногда мы не хотим, чтобы $
был таким особенным, потому что мы хотим использовать его как простой символ доллара, поэтому нам нужен способ его избежать.
И здесь приходит \
, потому что поскольку он используется для удаления метасимволов в регулярном выражении, Строки и, вероятно, в других местах, это хорошее соглашение, чтобы использовать его здесь, чтобы выйти из $
.
Итак, теперь \
также является метасимволом при замене части, поэтому, если вы захотите сделать простой прогон \
literal, вам нужно как-то избежать его. И угадай что? Вы избегаете его так же, как вы избегаете его в регулярном выражении или в String. Вам просто нужно разместить еще один \
до того, как вы ускользнули.
Итак, если вы хотите создать \
в заменяющей части, вам нужно добавить еще \
перед этим. Но помните, что для написания литерала \
в String вам нужно записать его как "\\"
, поэтому для создания двух \\
взамен вам нужно записать его как "\\\\"
.
Итак, попробуйте
s = s.replaceAll("'", "\\\\'");
или даже лучше, чтобы уменьшить явное экранирование в замещающей части (а также в части регулярного выражения - забыл упомянуть об этом ранее) просто используйте replace
вместо replaceAll
, который добавляет экранирование для нас
s = s.replace("'", "\\'");
Ответ 4
Это не говорит, как "исправить" проблему - это уже было сделано в других ответах; он существует для извлечения деталей и соответствующих ссылок документации.
При использовании String.replaceAll
или любого из применимых заменителей Matcher обратите внимание на заменяемую строку и то, как она обрабатывается:
Обратите внимание, что обратная косая черта (\
) и знаки доллара ($
) в заменяющей строке могут привести к тому, что результаты будут отличаться от того, будут ли они рассматриваться как буквальная строка замены. Знаки доллара могут рассматриваться как ссылки на захваченные подпоследовательности, как описано выше, и обратные косые черты используются для исключения буквенных символов в заменяющей строке.
Как указано isnot2bad в комментарии, Matcher.quoteReplacement
может быть здесь полезен:
Возвращает строчную замену String для указанной строки... Произведённая строка будет соответствовать последовательности символов в s, обрабатываемой как буквальная последовательность. Разрезы (\
) и знаки доллара ($
) не будут иметь особого значения.
Ответ 5
Вы также можете попробовать использовать что-то вроде StringEscapeUtils, чтобы сделать вашу жизнь еще проще: http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html
s = StringEscapeUtils.escapeJava(s);