В Java предположим, что у меня есть строковая переменная S, и я хочу найти ее внутри другой строки T, например:
if (T.matches(S)) ...
(примечание: строка выше была T.contains (), пока в нескольких сообщениях не было указано, что этот метод не использует регулярные выражения. Мое плохое.)
Но теперь предположим, что в S могут быть неприятные символы. Например, пусть S = "[привет". Левая квадратная скобка приведет к сбою регулярного выражения. Есть ли функция, которую я могу вызвать для выхода из S, чтобы этого не произошло? В данном конкретном случае я бы хотел, чтобы он был преобразован в "\ [привет".




Есть ли конкретная причина не использовать вместо String.indexOf ()? Таким образом, он всегда будет интерпретироваться как обычная строка, а не как регулярное выражение.
Начиная с Java 1.5 существует String # contains (...), что дает более читаемый код, чем indexOf (...).
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?
Как сказал Том Хотин, вам нужно указать шаблон. Вы можете сделать это двумя способами (редактировать: фактически тремя способами, как указано @ диастрофизм):
Обведите строку «\ Q» и «\ E», например:
if (T.matches("\Q" + S + "\E"))
Вместо этого используйте Шаблон. Код будет примерно таким:
Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
if (sPattern.matcher(T).matches()) { /* do something */ }
Таким образом, вы можете кэшировать скомпилированный паттерн и повторно использовать его. Если вы используете одно и то же регулярное выражение более одного раза, вы почти наверняка захотите сделать это таким образом.
Обратите внимание: если вы используете регулярные выражения для проверки того, находится ли строка внутри более крупной строки, вы должны поставить. * В начале и в конце выражения. Но это не сработает, если вы цитируете шаблон, поскольку он будет искать настоящие точки. Итак, вы абсолютно уверены, что хотите использовать регулярные выражения?
Попробуйте Pattern.quote (Строка). Он исправит все, что имеет особое значение в строке.
Возможный дубликат Как экранировать текст для регулярного выражения в Java