正则表达式模糊匹配
Fuzzy match by regular expression
如何通过正则表达式做一个"fuzzy search"?
例如,文本 "hp laptop" 可能是以下任何一项的模糊匹配:
xxx hp laptop
hp xxx laptop
laptop xxxxx hp
对每个单词使用前瞻:
(?=.*\bhp\b)(?=.*\blaptop\b).*
\b
表示 "word boundary",因此 "bhp"
和 "laptops"
不匹配。
前瞻,其形式为 (?=...)
,断言(但不使用)输入与正则表达式匹配(本例中的点 ...
)。因为它不消耗输入,所以指针在计算时不会前进,因此您可以在同一点进行多个前瞻。
阅读 this 以获得更详细的解释。
在搜索查询中使用尽可能多的这些前瞻性词。
我建议分别测试/\bhp\b/ig
和/\blaptop\b/ig
,如果第一次通过再测试第二次,这是最简单的方法。
这个/(\bhp\b).*(\blaptop\b)|(\blaptop\b).*(\bhp\b)/gi
可以很好地测试字符串中是否同时存在单词'hp'和'laptop',但它不是很灵活。
需要使用单词边界\b
以避免'fleshpot'和hplaptop等匹配
如何通过正则表达式做一个"fuzzy search"?
例如,文本 "hp laptop" 可能是以下任何一项的模糊匹配:
xxx hp laptop
hp xxx laptop
laptop xxxxx hp
对每个单词使用前瞻:
(?=.*\bhp\b)(?=.*\blaptop\b).*
\b
表示 "word boundary",因此 "bhp"
和 "laptops"
不匹配。
前瞻,其形式为 (?=...)
,断言(但不使用)输入与正则表达式匹配(本例中的点 ...
)。因为它不消耗输入,所以指针在计算时不会前进,因此您可以在同一点进行多个前瞻。
阅读 this 以获得更详细的解释。
在搜索查询中使用尽可能多的这些前瞻性词。
我建议分别测试/\bhp\b/ig
和/\blaptop\b/ig
,如果第一次通过再测试第二次,这是最简单的方法。
这个/(\bhp\b).*(\blaptop\b)|(\blaptop\b).*(\bhp\b)/gi
可以很好地测试字符串中是否同时存在单词'hp'和'laptop',但它不是很灵活。
需要使用单词边界\b
以避免'fleshpot'和hplaptop等匹配