Экранирование строки при синтаксическом анализе регулярного выражения в Java

В Java предположим, что у меня есть строковая переменная S, и я хочу найти ее внутри другой строки T, например:

   if (T.matches(S)) ...

(примечание: строка выше была T.contains (), пока в нескольких сообщениях не было указано, что этот метод не использует регулярные выражения. Мое плохое.)

Но теперь предположим, что в S могут быть неприятные символы. Например, пусть S = "[привет". Левая квадратная скобка приведет к сбою регулярного выражения. Есть ли функция, которую я могу вызвать для выхода из S, чтобы этого не произошло? В данном конкретном случае я бы хотел, чтобы он был преобразован в "\ [привет".

Возможный дубликат Как экранировать текст для регулярного выражения в Java

Aseem Bansal 17.10.2015 20:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
13
1
12 018
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Есть ли конкретная причина не использовать вместо String.indexOf ()? Таким образом, он всегда будет интерпретироваться как обычная строка, а не как регулярное выражение.

Начиная с Java 1.5 существует String # contains (...), что дает более читаемый код, чем indexOf (...).

Fabian Steeg 20.01.2009 18:30
Ответ принят как подходящий

String.contains не использует регулярное выражение, поэтому в этом случае проблем нет.

Если требуется регулярное выражение, а не строки со специальными символами регулярного выражения, используйте java.util.regex.Pattern.quote, чтобы избежать их.

Regex использует символ обратной косой черты '\' для экранирования литерала. Учитывая, что java также использует символ обратной косой черты, вам нужно будет использовать двойную косую черту, например:

   String S = "\[hi"

Это станет строкой:

  \[hi

который будет передан в регулярное выражение.

Или, если вам нужна только буквальная строка и вам не нужно регулярное выражение, вы можете сделать следующее:

if (T.indexOf("[hi") != -1)  {

T.contains () (согласно javadoc: http://java.sun.com/javase/6/docs/api/java/lang/String.html) не использует регулярные выражения. contains () делегирует только indexOf ().

Итак, здесь НЕ используются регулярные выражения. Вы думали о каком-нибудь другом методе String?

Как сказал Том Хотин, вам нужно указать шаблон. Вы можете сделать это двумя способами (редактировать: фактически тремя способами, как указано @ диастрофизм):

  1. Обведите строку «\ Q» и «\ E», например:

    if (T.matches("\Q" + S + "\E"))
    
  2. Вместо этого используйте Шаблон. Код будет примерно таким:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
    if (sPattern.matcher(T).matches()) { /* do something */ }
    

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

Обратите внимание: если вы используете регулярные выражения для проверки того, находится ли строка внутри более крупной строки, вы должны поставить. * В начале и в конце выражения. Но это не сработает, если вы цитируете шаблон, поскольку он будет искать настоящие точки. Итак, вы абсолютно уверены, что хотите использовать регулярные выражения?

Попробуйте Pattern.quote (Строка). Он исправит все, что имеет особое значение в строке.

Другие вопросы по теме