Java + Как заменить строку, содержащую '(' на '\\(', для регулярного выражения pattern.compile

У меня есть следующий код

StringToSearchIn ="Hello word (Figure 1)"; 
patternString= "word (Figure 1)" 
Pattern pattern = Pattern.compile(patternString);       
Matcher matcher = pattern.matcher(StringToSearchIn);
matcher.find()

Это возвращает 0, как '( or )' не распознается, когда я перехожу на patternString= "word \\(Figure 1\\)", возвращает счетчик совпадений как 1 Есть ли способ изменить мой patternString искать '(' и заменить на '\\(' динамически перед созданием шаблона.

Заранее спасибо.

4 ответа

Использование Pattern#quote(String regex):

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

Вы можете использовать флаг LITERAL.

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html:

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

Итак, в вашем коде:

Pattern pattern = Pattern.compile(patternString, Pattern.LITERAL);

Java имеет встроенный шаблон преобразования.

Шаблон - это скомпилированное представление регулярного выражения. Регулярное выражение, указанное в виде строки, сначала должно быть скомпилировано в экземпляр этого класса. Полученный шаблон можно затем использовать для создания объекта Matcher, который может сопоставлять произвольные последовательности символов с регулярным выражением. Все состояния, участвующие в выполнении сопоставления, находятся в сопоставителе, поэтому многие сопоставители могут использовать один и тот же шаблон.

Типичная последовательность вызовов, таким образом, является paternString.replace

 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();

Метод совпадений определяется этим классом для удобства, когда регулярное выражение используется только один раз. Этот метод компилирует выражение и сопоставляет входную последовательность с ним в одном вызове. Заявление

 boolean b = Pattern.matches("a*b", "aaaaab");

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

patternString = patternString.replace('(', '\('); 
patternString = patternString.replace(')', '\)'); 
Другие вопросы по тегам