Regex Word Boundary, Pattern.quote и круглые скобки

1

Я пишу функцию, которая позволяет пользователям искать поле текста для поисковых терминов, которые они могут ввести, и пометить их каким-то образом, например, выделить. У меня в настоящее время есть:

String text = "This is my (simple) test.";
String searchExpression = "(?i)\\b(" + Pattern.quote(searchTerm) + ")\\b";
String replaceExpression = markupToken + "$1" + markupToken;
String newText = text.replaceAll(searchExpression, replaceExpression);

Это отлично работает, если поисковый запрос "прост"; однако, если пользователь ищет "(простой)", он не будет успешно соответствовать. Если я удалю Pattern.quote или \b, это отлично работает.

Есть ли способ изменить searchExpression, что он будет работать в обоих этих сценариях?

Теги:

1 ответ

5
Лучший ответ

Ваше регулярное выражение не работает, потому что вы не можете сопоставить \b (граница слова) до и после ( и ) поскольку они не считаются символами слов.

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

String searchExpression = "(?i)(?<!\\w(?=\\w))(" + Pattern.quote(searchTerm) +
                          ")(?!(?<=\\w)\\w)";

т.е. использовать обратную сторону с обеих сторон, что означает, что символ слова не должен быть до и после шаблона, если в начале и конце слова поиска есть символ слова.

  • 0
    Это решает проблему, которая у меня есть, но разве это не могло бы сломаться другими способами? Например, если пользователь ищет «/» в 1/3/14, он не вернется, поскольку он окружен символом слова, верно?
  • 0
    Но тогда зачем вам слово границы? Общая цель границы слова состоит в том, что не должно быть никаких символов слова с обеих сторон.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню