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

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

371 голосов
/ 16 февраля 2011

Я сохраняю запрос 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%\'

Я избегаю одинарных кавычек с обратной косой чертой.Однако я не могу избежать знака%.

Как включить оператор like в файл strings.xml?

Ответы [ 4 ]

798 голосов
/ 16 февраля 2011

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

11 голосов
/ 21 июля 2015

Чтобы дополнить предыдущее решение, используйте:

str = str.replace("%", "%%");
0 голосов
/ 17 августа 2017

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

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

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

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

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

0 голосов
/ 27 июля 2016

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

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...