Сегодня занимался в 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)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости