Есть ли какой-либо метод в Java или в любой библиотеке с открытым исходным кодом для экранирования (не цитирования) специального символа (метасимвола), чтобы использовать его как регулярное выражение?
Это было бы очень удобно при динамическом построении регулярного выражения без необходимости вручную удалять каждый отдельный символ.
Например, рассмотрим простое регулярное выражение типа \d+\.\d+
, которое соответствует числам с десятичной точкой, например 1.2
, а также следующий код:
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
Неудивительно, что результат, полученный с помощью вышеуказанного кода:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
То есть regex1
соответствует 1.2
, но regex2
(который "динамически" построен) не (вместо этого он соответствует литеральной строке d+.d+
).
Итак, существует ли метод, который автоматически удалял бы каждый метасимвол регулярного выражения?
Если бы был, скажем, статический метод escape()
в java.util.regex.Pattern
, вывод
Pattern.escape('.')
будет строка "\."
, но
Pattern.escape(',')
должен просто создать ","
, так как это не метасимвол. Аналогично,
Pattern.escape('d')
может генерировать "\d"
, так как 'd'
используется для обозначения цифр (хотя экранирование может не иметь смысла в этом случае, поскольку 'd'
может означать буквальный 'd'
, который не будет неправильно интерпретирован с помощью регулярного выражения быть чем-то другим, как в случае с '.'
).