在Java中使用边界匹配编写正则表达式的最有效方法是什么?

时间:2016-09-09 21:21:48

标签: java regex boundary word-boundaries

所以我发现边界这个词非常有效,可以确保在文本中找到正确的单词,如果它们只包含这个单词的一部分,我们就不会删除其他单词,但是我注意到它的作用很糟糕在String开始和结束。

理想情况下,我希望像这样的正则表达式在字符串的开头和结尾也能正常工作,因为这也是单词开始/结束的地方:

String regex1 = "\\b" + searchedWord + "\\b";

然而事实证明我必须像这样转换正则表达式,以确保它也适用于字符串的开始和结束:

String regex2 = "(^|\\b)" + searchedWord + "($|\\b)";

我还没有发现使用后者正则表达式的任何副作用,但我想知道是否有任何特殊的边界或如何更有效地写边界,以使其不那么丑陋和反直觉。 / p>

有人知道更好的方法吗?也许您也可以改进我建议的正则表达式,以防您在使用它时发现任何问题。

1 个答案:

答案 0 :(得分:0)

如果searchWord的第一个和最后一个字符是单词字符,则不会产生任何副作用。

"侧"只有当两端的字符都是非单词字符时才会出现效果。

现在,\b可以匹配4个位置:字符串开头和单词字符之间,非单词和单词字符之间,单词和非单词字符之间,以及单词字符和结尾之间串。 如果你需要确保searchWord之前没有单词char,你可以使用明确的(?<!\w)负面的lookbehind并确保单词后面没有单词char ,您可以使用(?!\w)否定前瞻。

还要记住,\b\w相同,本身并不支持Unicode。添加Pattern.UNICODE_CHARACTER_CLASS标记或(?U)

String regex1 = "(?U)(?<!\\w)" + searchedWord + "(?!\\w)";

其他方式通常包括确保

周围(或在字符串的开头/结尾)有空格
String regex1 = "(?U)(?<!\\S)" + searchedWord + "(?!\\S)";

虽然在标点符号之前或之后都不匹配。