我正在编写一个函数,允许用户在文本字段中搜索他们可以输入的搜索词,并以某种方式标记它们,例如突出显示。我现在拥有的是:
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,它会在这两种情况下都有效?
答案 0 :(得分:5)
您的正则表达式失败,因为您无法在\b
和(
之前和之后匹配)
(字边界),因为这些不被视为字符。
你可以调整你的正则表达式:
String searchExpression = "(?i)(?<!\\w(?=\\w))(" + Pattern.quote(searchTerm) +
")(?!(?<=\\w)\\w)";
即。在任何一方都使用lookarounds,这意味着如果搜索词在开头和结尾都有一个单词字符,那么在模式之前和之后不应该有单词字符。