如何改进多词匹配正则表达式

How to improve multiword match regex

本文关键字:正则表达式 何改进      更新时间:2023-09-26

我目前让用户输入一个可以包含许多单词的搜索字符串。然后,我将每个单词分开,然后基于每个单词构建正则表达式。然后,我通过MongoDB使用正则表达式搜索搜索200,000+条目的列表。它运行良好,但性能很差。任何可能对正则表达式提高性能的建议都值得赞赏!

//this is an example search
var search = "angel alter";
var searchSplitted = search.split(" ");
    var expression = '';
    //This is how I build my regex
    for(i=0; i<searchSplitted.length; i++){
      expression += '(?=.*' + searchSplitted[i] + ')';
    }
expression += '.*';

"A.*B"是一个非常耗时的正则表达式,因为正则表达式搜索通常是贪婪的。所以它会找到"A",然后".*"将"消耗"剩余的全部字符串,然后尝试匹配"B"。如果做不到这一点,它将释放字符串末尾的一个字符,并尝试再次匹配"B"。将其乘以查询中的".*"数,您将获得非常差的性能。

创建更复杂的搜索查询而不是复杂的正则表达式会快得多。因此,与其尝试将搜索查询放入单个正则表达式中,不如尝试将其分解为简单搜索条件的组合,每个单词一个。即,不是"正则表达式匹配 A.*B.*C...",而是写"(正则表达式匹配 A)和(正则表达式匹配 B)和(正则表达式匹配 C)..."。搜索单个单词比查询快得多,如果失败,则只需跳过任何后续条件,从而节省性能。

实际上,除非您在搜索查询中需要正则表达式功能,否则您可以完全摆脱正则表达式,用纯文本搜索代替它们,这总是更快。