Экранирование специальных символов в регулярных выражениях Java
Есть ли какой-либо метод в 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'
который не будет неправильно понят интерпретатором регулярных выражений как нечто иное, как в случае с'.'
).