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

StackOverflow https://stackoverflow.com/questions/168639

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

<Ол>
  • Окружите строку символом " \ Q " и " \ E " ;, например:

    if (T.matches("\\Q" + S + "\\E"))
    
  • Используйте шаблон вместо. Код будет примерно таким:

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top