如何改进多词匹配正则表达式
How to improve multiword match regex
我目前让用户输入一个可以包含许多单词的搜索字符串。然后,我将每个单词分开,然后基于每个单词构建正则表达式。然后,我通过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)..."。搜索单个单词比查询快得多,如果失败,则只需跳过任何后续条件,从而节省性能。
实际上,除非您在搜索查询中需要正则表达式功能,否则您可以完全摆脱正则表达式,用纯文本搜索代替它们,这总是更快。
相关文章:
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- 正则表达式在字符串中找到base64
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- 使用正则表达式评估电子邮件地址时出现性能问题
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 改进用于验证付款金额的正则表达式
- [^/:]|正则表达式改进的倒数
- 如何改进多词匹配正则表达式
- 正则表达式来处理标点符号和文本改进
- 正则表达式改进
- 如何改进此正则表达式
- 改进正则表达式以匹配有效值
- 如何改进此正则表达式,使其在字符串位于注释中时不匹配
- 改进向前看正则表达式
- 正则表达式改进匹配
- 正则表达式的改进.接受点