Ответ 1
Чтобы выйти из %
, вам нужно удвоить его: %%
.
Я сохраняю SQL-запрос в файле strings.xml, и я хочу использовать String.Format
для создания окончательной строки в коде. Оператор SELECT
использует подобное, что-то вроде этого:
SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE '%something%'
Чтобы форматировать, я заменяю "что-то" на% 1 $s, поэтому он становится:
SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE \'%%1$s%\'
Я избегаю одиночных кавычек с обратной косой чертой. Однако я не могу избежать знака%.
Как включить в файл strings.xml такой же оператор?
Чтобы выйти из %
, вам нужно удвоить его: %%
.
В дополнение к предыдущему заявленному решению используйте:
str = str.replace("%", "%%");
Это более сильная замена регулярных выражений, которая не заменит %%, которые уже удвоены на входе.
str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");
Я не могу поверить, что сейчас это не простая проблема, но эй, вот мой удар в нее
(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])
Чтобы очистить сообщение до передачи его в String.format, вы можете использовать следующие
Pattern p = Pattern.compile("(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])");
Matcher m1 = p.matcher(log);
StringBuffer buf = new StringBuffer();
while (m1.find())
m1.appendReplacement(buf, log.substring(m1.start(), m1.start(2)) + "%%" + log.substring(m1.end(2), m1.end()));
// Return the sanitised message
String escapedString = m1.appendTail(buf).toString();
Обратите внимание, что это работает с любым количеством символов форматирования, поэтому он заменит% на %%, %%% %%%%, %%%%% с %%%%%% и т.д.
Он оставит любые уже экранированные символы (например, %%, %%%% и т.д.)