Как избежать% в String.Format?

Я сохраняю 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 такой же оператор?

Ответ 1

Чтобы выйти из %, вам нужно удвоить его: %%.

Ответ 2

В дополнение к предыдущему заявленному решению используйте:

str = str.replace("%", "%%");

Ответ 3

Это более сильная замена регулярных выражений, которая не заменит %%, которые уже удвоены на входе.

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");

Ответ 4

Я не могу поверить, что сейчас это не простая проблема, но эй, вот мой удар в нее

(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])

Чтобы очистить сообщение до передачи его в 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();

Обратите внимание, что это работает с любым количеством символов форматирования, поэтому он заменит% на %%, %%% %%%%, %%%%% с %%%%%% и т.д.

Он оставит любые уже экранированные символы (например, %%, %%%% и т.д.)