Я получаю некоторые странные результаты при использовании replaceAll метода Строкового класса.
Строковый запрос содержит следующее: @cm:name:"hello"
Если я говорю query.replaceAll(":", "\\:");
Я ожидал бы следующий результат: @cm\:name\:"hello"
Вместо этого я добираюсь: @cm:name:"hello"
. Исходное содержание.
Не используйте replaceAll(...)
для неречевых замен. Вместо этого используйте replace(...)
.
Затем убедитесь, что:
query = query.replace(":", "\\:");
поскольку String
неизменяем - т.е. если вы просто вызовете метод без присвоения результата, вы ничего не получите - внутреннее состояние объекта не изменится.
Есть два простых правила.
Компилятор Java требует два блэкслеша для представления одного обратного слеша в строковом литерале.
Регулярные выражения требуют два обратных слеша для представления одного обратного слеша в регулярном выражении.
Поэтому, если вы хотите, чтобы строковый литерал содержал один обратный слеш в регулярном выражении, вы должны написать четыре.
Конечная последовательность для \
- \\\
. Таким образом, вы напишите так:
query.replaceAll(":", "\\:");