Я пишу функцию, которая позволяет пользователям искать поле текста для поисковых терминов, которые они могут ввести, и пометить их каким-то образом, например, выделить. У меня в настоящее время есть:
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, что он будет работать в обоих этих сценариях?
Ваше регулярное выражение не работает, потому что вы не можете сопоставить \b
(граница слова) до и после (
и )
поскольку они не считаются символами слов.
Вы можете настроить свое регулярное выражение следующим образом:
String searchExpression = "(?i)(?<!\\w(?=\\w))(" + Pattern.quote(searchTerm) +
")(?!(?<=\\w)\\w)";
т.е. использовать обратную сторону с обеих сторон, что означает, что символ слова не должен быть до и после шаблона, если в начале и конце слова поиска есть символ слова.