Сегодня занимался в Java проблемой кавычек в SQL запросах (инъекция) и обнаружил, что чтобы после результата функции получить \'
, я должен написать следующее:
String key = entry.getKey().replaceAll("'", "\\\\\\\\\'");
/*Оригинальная строчка*/
UPDATE t1 SET A' = '1' WHERE A = 'firefly';
/*Результат функции*/
UPDATE t1 SET A\' = '1' WHERE A = 'firefly';
Если я напишу просто \\'
, по вернется простая '
. Почему такое происходит? Я проверил с помощью System.out.println('\\');
, где консоль мне вернула \
, то есть верный результат.
Для простой замены одного конкретного символа на пару других регулярные выражения не требуются, используйте String#replace
:
String result = text.replace("'", "\\'");
Если же всё-таки нужно заменить совпадение регулярного выражения каким-то буквальным текстом, без шаблонов, местозаполнителей, обратных ссылок и т.д. воспользуйтесь методом Matcher.quoteReplacement
, который экранирует всё, что нужно в шаблоне замены (не путайте с Pattern.quote
!):
String result = text.replaceAll("'", Matcher.quoteReplacement("\\'"));
Зачем нужно экранировать $
и \
в шаблоне замены? Эти символы используются для задания специальных конструкций в шаблоне замены. \
(буквальный символ, "\\"
в строковом литерале Java) является экранирующим символом $
, а $
с последующим за ним числом формирует обратную ссылку на значение соответствующей захватывающей подмаски.
Пример кода:
import java.util.regex.*;
// ...
String dano = "UPDATE t1 SET A' = '1' WHERE A = 'firefly';";
System.out.println(dano.replace("'", "\\'"));
// => UPDATE t1 SET A\' = \'1\' WHERE A = \'firefly\';
System.out.println(dano.replaceAll("'", Matcher.quoteReplacement("\\'")));
// => UPDATE t1 SET A\' = \'1\' WHERE A = \'firefly\';
Читай документацию
Note that backslashes (\
) and dollar signs ($
) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll
. Use Matcher.quoteReplacement(java.lang.String)
to suppress the special meaning of these characters, if desired.
Документация replaceAll(java.lang.String, java.lang.String)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как сделать чтобы методе класса можно было перекинуть ссылку объекта на созданный новый объект
Пытаюсь добавить несколько фрагментов в один контейнер, но в результате получается так, как если бы добавлял без цикла первый фрагментГде...
Решил реализовать в коде обновление информации по API запросу через определенный интервал времениСразу по нажатию кнопки информация приходит...