我正在编写一个函数,允许用户在文本字段中搜索他们可以输入的搜索词,并以某种方式标记它们,例如突出显示.我现在拥有的是:
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);
Run Code Online (Sandbox Code Playgroud)
如果搜索词"简单",这种方法很有用; 但是,如果用户搜索"(简单)",则无法成功匹配.如果我删除Pattern.quote或\ b,这可以正常工作.
有没有办法修改searchExpression,它将在这两种情况下都有效?
您的正则表达式失败,因为您不能\b在之前和之后匹配(单词边界)(,)因为这些不被视为单词字符.
你可以调整你的正则表达式:
String searchExpression = "(?i)(?<!\\w(?=\\w))(" + Pattern.quote(searchTerm) +
")(?!(?<=\\w)\\w)";
Run Code Online (Sandbox Code Playgroud)
即使用任何一方的外观,这意味着如果搜索词在开头和结尾都有一个单词字符,则在模式之前和之后不应该有单词字符.