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(')', '\)');