Каково использование метода Pattern.quote?

Я пытаюсь понять Pattern.quote, используя следующий код:

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545");
System.out.println("Pattern is : "+pattern);

выводит результат:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E

Что такое \Q и \E здесь? В описании документации указано:

Возвращает буквенный шаблон String для указанного String.

Этот метод создает String, который может быть использован для создания Pattern, который будет соответствовать строке s, как если бы это был литерал.

Метасимволы или escape-последовательности во входной последовательности не будут иметь особого значения.

Но Pattern.quote тип возвращаемого значения String, а не скомпилированный объект Pattern.

Зачем нужен этот метод и какие примеры использования?

Ответ 1

\Q означает "начало буквального текста" (т.е. "открытая цитата" regex)

\E означает "конец буквального текста" (т.е. regex "закрыть цитату" )

Вызов метода Pattern.quote() завершает строку в \Q...\E, что превращает текст в литерал регулярного выражения. Например, Pattern.quote(".*") будет соответствовать точке, а затем звездочке:

System.out.println("foo".matches(".*")); // true
System.out.println("foo".matches(Pattern.quote(".*"))); // false
System.out.println(".*".matches(Pattern.quote(".*"))); // true

Цель метода состоит в том, чтобы не требовать от программиста запоминания специальных терминов \Q и \E и добавить немного читаемости в код - регулярное выражение достаточно сложно читать. Для сравнения:

someString.matches(Pattern.quote(someLiteral));
someString.matches("\\Q" + someLiteral + "\\E"));

Ссылаясь на javadoc:

Возвращает строковый шаблон String для указанной строки.

Этот метод создает строку, которая может быть использована для создания шаблона, который будет соответствовать строке s, как если бы это был буквенный шаблон.

Метасимволы или escape-последовательности во входной последовательности не будут иметь особого значения.

Ответ 2

Метод Pattern.quote цитирует часть шаблона регулярного выражения, чтобы заставить regex интерпретировать его как строковые литералы.

Скажите, что у вас есть пользовательский ввод в вашей поисковой программе, и вы хотите повторно использовать его. Но этот ввод может содержать небезопасные символы, поэтому вы можете использовать

Pattern pattern = Pattern.compile(Pattern.quote(userInput));

Этот метод не цитирует Pattern, но, как вы указываете, обертывает String в кавычки регулярных выражений.

Ответ 3

\Q и \E, среди всех остальных, подробно описаны на странице java.util.regex.Pattern Javadoc. Они означают "begin Q uote", " E nd quote" и разметить область, где все символы имеют буквальное значение. Способ использования возврата Pattern.quote заключается в том, чтобы передать его на Pattern.compile или любой другой метод, который принимает строку шаблона, например String.split.

Ответ 4

Если вы скомпилируете String, возвращаемый Pattern.quote, вы получите Pattern, который соответствует строковой букве, которую вы quote d.

\Q и \E отметьте начало и конец цитируемой части строки.

Ответ 5

Regex часто сталкивается с обычными строками. Скажем, я хочу, чтобы регулярное выражение искало определенную строку, которая известна только во время выполнения. Как мы можем быть уверены, что строка не имеет значения регулярного выражения, например (".*.*.*")? Мы приводим его.