【发布时间】:2015-02-04 22:14:20
【问题描述】:
用例是我想将查询字符串与单词数组进行比较,并返回匹配项。匹配是当一个单词包含查询字符串中的所有字符时,顺序无关紧要,重复字符都可以。正则表达式似乎太强大了(只需要锤子的大锤)。我编写了一个解决方案,通过循环遍历字符并使用 indexOf 来比较字符,但它似乎始终较慢。 (http://jsperf.com/indexof-vs-regex-inside-a-loop/10) 正则表达式是此类操作的最快选项吗?有没有办法让我的替代解决方案更快?
var query = "word",
words = ['word', 'wwoorrddss', 'words', 'argument', 'sass', 'sword', 'carp', 'drowns'],
reStoredMatches = [],
indexOfMatches = [];
function match(word, query) {
var len = word.length,
charMatches = [],
charMatch,
char;
while (len--) {
char = word[len];
charMatch = query.indexOf(char);
if (charMatch !== -1) {
charMatches.push(char);
}
}
return charMatches.length === query.length;
}
function linearIndexOf(words, query) {
var wordsLen = words.length,
wordMatch,
word;
while (wordsLen--) {
word = words[wordsLen];
wordMatch = match(word, query);
if (wordMatch) {
indexOfMatches.push(word);
}
}
}
function linearRegexStored(words, query) {
var wordsLen = words.length,
re = new RegExp('[' + query + ']', 'g'),
match,
word;
while (wordsLen--) {
word = words[wordsLen];
match = word.match(re);
if (match !== null) {
if (match.length >= query.length) {
reStoredMatches.push(word);
}
}
}
}
【问题讨论】:
-
可以向 indexOf() 提供多个字符,这应该比简单的 RegExp 更快:只需使用“return query.indexOf(word)!==-1”
-
正则表达式在浏览器本机编译代码中运行。也许你的代码更适合你的情况,但 JS 更慢。
-
请注意,您的代码似乎比 Firefox 上的正则表达式快得多。
-
我可能有一个想法,但我需要更精确。单词只能由字母组成吗?如果不是,是否可以将可能的字符减少到小于“所有字符”的组(例如“字母+数字”或“ascii 字符”或“非空格”......)?另一个问题,是预先固定的单词列表,从某种意义上说,它从脚本的开头到结尾永远不会改变?最后,你知道你的单词列表的大小(在现实世界中)吗?
-
我的回答有什么遗漏吗?您尚未评论、投票或接受它,但它似乎回答了您的问题。
标签: javascript regex performance