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

时间:2016-02-22 03:03:13

标签: javascript regex mongodb

我目前让用户输入一个可以包含很多单词的搜索字符串。然后我将每个单词分开,然后根据每个单词构建正则表达式。然后,我通过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 += '.*';

1 个答案:

答案 0 :(得分:1)

"A.*B"是一个非常耗时的正则表达式,因为正则表达式搜索通常是贪婪的。因此,它会找到"A",然后".*"将“消耗”剩余字符串的全部内容,然后尝试匹配"B"。如果失败,它会在字符串末尾释放一个字符并尝试再次匹配"B"。将您的查询中".*"的数量乘以,您的效果会非常差。

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

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