Подтвердить что ты не робот

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

Я действительно застрял здесь, надеюсь, что кто-то может мне помочь здесь.

Спасибо,

Айван

4b9b3361

Ответ 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, обрабатываемой как буквальная последовательность. Разрезы (\) и знаки доллара ($) не будут иметь особого значения.