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

Javascript: Regex vs IndexOf when scanning for a list of keywords

我看到当你根据这里的解决方案扫描一个词时,indexOf 更快 JavaScript: indexOf vs. Match when Searching Strings?

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

下面会更快吗?

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

对....

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

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

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

这样的工具上尝试一下

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

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