Javascript:Regex vs IndexOf扫描关键字列表时

时间:2015-08-19 17:04:48

标签: javascript regex indexof

根据此处的解决方案{3}

,当您扫描一个单词时,我发现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()仍然更快吗?

1 个答案:

答案 0 :(得分:2)

/aaa|bbb|ccc/这样的正则表达式永远不会比/abc/更简单(但仍然类似,3个字符)的表达式更有效。这是因为正则表达式引擎从左到右匹配。最简单的比赛将是&#39; aaa&#39;对于第一个&#39; abc&#39;对于第二个...这些都需要3个步骤。现在,想象一下,你试着匹配&#39; aabbccx&#39;这两个表达方式。第一个表达式总共需要33个步骤,第二个表达式需要5个步骤,这是因为每次交替(用|表示)都会强制正则表达式引擎重新开始。在像Regex101这样的工具上使用它。

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

当基准测试发挥作用时 - 使用jsPerf