正则表达式单词边界,Pattern.quote和括号

时间:2015-02-02 19:45:59

标签: java regex

我正在编写一个函数,允许用户在文本字段中搜索他们可以输入的搜索词,并以某种方式标记它们,例如突出显示。我现在拥有的是:

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 个答案:

答案 0 :(得分:5)

您的正则表达式失败,因为您无法在\b(之前和之后匹配)(字边界),因为这些不被视为字符。

你可以调整你的正则表达式:

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

即。在任何一方都使用lookarounds,这意味着如果搜索词在开头和结尾都有一个单词字符,那么在模式之前和之后不应该有单词字符。