【问题标题】:Fuzzy match by regular expression正则表达式的模糊匹配
【发布时间】:2015-09-17 10:49:11
【问题描述】:

如何通过正则表达式进行“模糊搜索”?

例如,文本“hp laptop”可能与以下任何一项模糊匹配:

xxx hp laptop
hp xxx laptop
laptop xxxxx hp

【问题讨论】:

  • 试试\bhp\b.*?\blaptop\b|\blaptop\b.*?\bhp\b。但我猜它看起来不太好。

标签: regex fuzzy-search


【解决方案1】:

对每个单词使用前瞻:

(?=.*\bhp\b)(?=.*\blaptop\b).*

\b 表示“单词边界”,所以"bhp" 和"laptops" 不会匹配。

见live demo。

具有(?=...) 形式的前瞻断言(但不消耗)输入与正则表达式匹配(在此示例中为点...)。因为它不消耗输入,所以在计算指针时指针不会前进,因此您可以在同一点进行多个前瞻。

阅读this 了解更详细的说明。

在搜索查询中使用尽可能多的这些前瞻。

【讨论】:

  • 我应该提供一个锚。
  • 我很惭愧地承认我从未听说过正则表达式中的前瞻。很酷的东西。
  • @Bohemian 只剩下一个问题......表达式中的最后两个字符(点和星号)实际上需要吗?
  • @Amarnasan 是的,您需要尾随 .*,否则将不会匹配任何输入(会有匹配项,但在第一个搜索词之前的每个字符对之间它们的宽度为零)
  • @AvinashRaj 锚^ 不是必需的 - 它是隐含的(添加锚不会有任何区别)
【解决方案2】:

我建议分别测试/\bhp\b/ig和/\blaptop\b/ig,如果第一个通过则测试第二个,这是最简单的方法。

这个/(\bhp\b).*(\blaptop\b)|(\blaptop\b).*(\bhp\b)/gi 可以很好地测试一个字符串中是否同时存在“hp”和“laptop”这两个词,但它不是很灵活。

需要使用单词边界\b,以避免'fleshpot'和hplaptop等匹配。

test

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多