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

Ответы на вопрос(6)

Ваш ответ на вопрос