Як уникнути% у String.Format?


445

Я зберігаю 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?


Не забудьте належним чином уникнути% s.
Сева Алексєєв


Вони будуть вводити їх у власну базу даних, тут не хвилюється;)
Метью

7
Ну, навіть якщо це ваша власна база даних, можна випадково написати запити, які роблять погані речі. Або просто написати запити, які не компілюються. Підготовка запитів - це корисна звичка вступати.
Рауні Ліллемець

Хоча це повільніше, ніж String.format()ви можете використовувати MessageFormat()замість цього.
ccpizza

Відповіді:


926

Для того, щоб уникнути %, вам потрібно буде подвоїти його: %%.


14

Щоб доповнити попереднє заявлене рішення, використовуйте:

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

1
Це замінить%, які вже подвоїлися. Будь ласка, прочитайте іншу відповідь.
Toilal

1
@Toilal Чому хтось уникне чогось, що вже врятується? І якщо він би, чому б насправді цього не зробити? Можливо, він мав намір мати два знаки, тож правильна форма, що втекла, буде "%%%%"
Девід Балажич

2

Це сильніша заміна регулярного вираження, яка не замінить %%, які вже подвоєні у введенні.

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

-3

Ось варіант, якщо вам потрібно уникнути декількох% у рядку з деякими вже уникнутими.

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

Щоб очистити повідомлення перед тим, як передати його 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();

Це працює з будь-якою кількістю символів форматування, тому він замінить% на %%, %%% з %%%%, %%%%% на %%%%%% тощо.

Усі залишені символи залишать у спокої (наприклад, %%, %%%% тощо)


8
"Я не можу повірити, що це не просто вирішена проблема на даний момент" << Ви відповіли через 6 років після прийняття простого рішення.
AjahnCharles
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.