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

标签 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 += '.*';

最佳答案

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

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

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

关于javascript - 如何改进多字匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35545149/

相关文章:

python - 如何删除多行文本中特定字符或字符串之前的文本?

Ruby gsub 正则表达式意外行为

MongoDB 嵌套设计哲学

javascript - MongoDB:如何获取特定文档的计数?

javascript - 正则表达式:匹配一个子字符串,但稍后排除另一个子字符串

javascript - 在 angular2 中渲染 formControlName 时未定义 formcontrolname

javascript - Google Analytics 报告 v4(过滤器)

regex - Perl 模式匹配,我们打印所有匹配部分,但仅打印匹配部分(而不是其余部分)

javascript - 无法有意发出 http 请求

java - 使用聚合从 Mongo 集合中获取平均值