在 Java 中使用边界匹配编写正则表达式的最有效方法是什么?
What are the most efficient ways to write regex with boundary matching in Java?
所以我发现单词边界非常有效,可以确保在文本中准确地找到该单词,并且如果其他单词只包含该单词的一部分,我们不会删除它们,但是我注意到了在字符串开始和结束时效果不佳。
所以理想情况下,我希望像这样的正则表达式在字符串开头和结尾也能很好地工作,因为这也是单词 starts/ends:
String regex1 = "\b" + searchedWord + "\b";
然而事实证明我必须像这样转换正则表达式以确保它也适用于字符串开始和结束:
String regex2 = "(^|\b)" + searchedWord + "($|\b)";
我还没有发现使用后一个正则表达式的任何副作用,但是我想知道是否有任何特殊的边界或者如何更有效地编写边界以使其不那么丑陋和不那么违反直觉.
有人知道更好的方法吗?也许您也可以改进我建议的正则表达式,以防您在使用它时发现任何问题。
如果 searchWord
的第一个和最后一个字符是单词字符,则不会有副作用。
"Side" 效果只有在两端的字符都是非单词字符时才会出现。
现在,\b
可以匹配 4 个位置:字符串开头和字符字符之间、非字符字符和字符字符之间、字符字符和非字符字符之间以及字符字符和字符字符之间字符串的结尾。 如果您需要确保 searchWord
之前没有单词 char,您可以使用明确的 (?<!\w)
否定后视并确保没有单词 char在这个词之后,你可以使用 (?!\w)
negative lookahead。
还要记住 \b
与 \w
一样,它本身不支持 Unicode。添加 Pattern.UNICODE_CHARACTER_CLASS
标志或 (?U)
:
String regex1 = "(?U)(?<!\w)" + searchedWord + "(?!\w)";
其他方法通常包括确保
周围(或字符串的 start/end 处)有空格
String regex1 = "(?U)(?<!\S)" + searchedWord + "(?!\S)";
虽然标点符号之前或之后不会匹配。
所以我发现单词边界非常有效,可以确保在文本中准确地找到该单词,并且如果其他单词只包含该单词的一部分,我们不会删除它们,但是我注意到了在字符串开始和结束时效果不佳。
所以理想情况下,我希望像这样的正则表达式在字符串开头和结尾也能很好地工作,因为这也是单词 starts/ends:
String regex1 = "\b" + searchedWord + "\b";
然而事实证明我必须像这样转换正则表达式以确保它也适用于字符串开始和结束:
String regex2 = "(^|\b)" + searchedWord + "($|\b)";
我还没有发现使用后一个正则表达式的任何副作用,但是我想知道是否有任何特殊的边界或者如何更有效地编写边界以使其不那么丑陋和不那么违反直觉.
有人知道更好的方法吗?也许您也可以改进我建议的正则表达式,以防您在使用它时发现任何问题。
如果 searchWord
的第一个和最后一个字符是单词字符,则不会有副作用。
"Side" 效果只有在两端的字符都是非单词字符时才会出现。
现在,\b
可以匹配 4 个位置:字符串开头和字符字符之间、非字符字符和字符字符之间、字符字符和非字符字符之间以及字符字符和字符字符之间字符串的结尾。 如果您需要确保 searchWord
之前没有单词 char,您可以使用明确的 (?<!\w)
否定后视并确保没有单词 char在这个词之后,你可以使用 (?!\w)
negative lookahead。
还要记住 \b
与 \w
一样,它本身不支持 Unicode。添加 Pattern.UNICODE_CHARACTER_CLASS
标志或 (?U)
:
String regex1 = "(?U)(?<!\w)" + searchedWord + "(?!\w)";
其他方法通常包括确保
周围(或字符串的 start/end 处)有空格String regex1 = "(?U)(?<!\S)" + searchedWord + "(?!\S)";
虽然标点符号之前或之后不会匹配。