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!
我看到当你根据这里的解决方案扫描一个词时,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!