【问题标题】:Javascript: Regex vs IndexOf when scanning for a list of keywordsJavascript:扫描关键字列表时的正则表达式与 IndexOf
【发布时间】:2015-08-19 17:04:48
【问题描述】:

根据JavaScript: indexOf vs. Match when Searching Strings?JavaScript: indexOf vs. Match when Searching Strings? 处的解决方案,当您扫描一个单词时,我发现 indexOf 更快

但是,如果您有一个包含 5 个关键字的列表,并且您想计算每个关键字的出现次数(假设每个单词在大文本字符串中只出现一次),该怎么办。

下面会更快吗?

var list1 = ['word1', 'word2','word3','word4','word5'];
for (var i = 0; i < list1.length; i++){
     if (exampleLargeText.indexOf(list1[i]) > -1){
    keywordCounter++;
    }
} 

vs....

var keywordRegex =  'word1|word2|word3|word4|word5'];  
var keywordCounter = exampleLargeText.toLowerCase().match(new RegExp(SUBMIT_ELEMENT_REGEX , "ig")) || []).length

尽管您在这里扫描 exampleLargeText 5 次,但 indexOf() 是否仍然更快?

【问题讨论】:

  • 测试一下。这是找出答案的唯一方法。

标签: javascript regex indexof


【解决方案1】:

/aaa|bbb|ccc/ 这样的正则表达式永远不会比像/abc/ 这样的更简单(但仍然相似,3 个字符)表达式更有效。这是因为正则表达式引擎从左到右匹配。最简单的匹配是第一个匹配的“aaa”和第二个匹配的“abc”……每个都需要 3 个步骤。现在,想象一下,您尝试将 'aabbccx' 匹配到这两个表达式。第一个表达式总共需要 33 个步骤,而第二个表达式总共需要 5 个步骤,这是因为每次交替(由 | 表示)都会强制正则表达式引擎重新开始。在Regex101 之类的工具上玩弄它。

但是,如果您能够更多优化正则表达式而不是单独检查每个单词,那么它就有机会击败.indexOf()。例如,如果你的表达式真的是/word1|word2|word3|word4|word5/,它可以重写为/word[1-5]/。这比单独查找每个单词更有效,因为现在表达式以简单的模式定义。不过谁知道呢,.indexOf() 仍然可能更快,具体取决于开销。

这就是基准测试发挥作用的时候——使用jsPerf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 2013-04-10
    • 1970-01-01
    • 2017-07-07
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多