在我的Node.js应用程序中,我有一个数组中的单词列表我想看看是否有任何随机字符串(实际上是一条推文。)我不一定关心哪个单词出现以及它们出现的频率,我只想多次出现在字符串中的任何单词。
所以,例如,如果我有一个数组:
search = ['foo', 'bar', 'roger'];
我有一个字符串"foo bar"
,我想要2
的回复。如果我有一个字符串"hello world, roger"
,
我想要1
的回复。等等。
最好的方法是什么?常用表达?其他一些黑魔法?
看起来它应该很容易,但我对于如何以一种让Google理解它的方式来表达它并不是最微妙的想法。 ;)
答案 0 :(得分:4)
最好的方法是什么?常用表达?其他一些黑魔法?
这里没有黑魔法,只是正则表达式。
"hello world, roger".match(/foo|bar|roger/g).length
应该这样做。
答案 1 :(得分:1)
一个注意事项 :正则表达式在执行复杂操作时非常快,但在执行大量简单操作时却非常慢。在这种情况下,如果searchString很大,我会尽量避免创建复杂的正则表达式。
首先,将搜索转换为哈希:
var search = ['foo', 'bar', 'roger'];
var searchHash = {}, i=0;
for (i=0;i<search.length;i++){
searchHash[search[i]]=true;
}
然后,将输入字符串拆分为一系列单词:
var inputWords = "foo bar".split(" ");
现在,搜索每个单词的频率:
var wordFreq = {}, var total=0;
for (i=0;i<inputWords.length;i++){
//Check to see if this word is in our hash
if (searchHash[inputWords[i]]) {
//If it is add one to its count
wordFreq[inputWords[i]] = wordFreq[inputWords[i]] || 0;
wordFreq[inputWords[i]]++;
total++;
}
}
最后,以频率输出所有单词:
Object.keys(wordFreq).forEach(function(key, index){
console.log(key + ": "+ wordFreq[key]);
});
console.log("Total matches: "+total);
答案 2 :(得分:1)
var search = ['bar', 'foo', 'roger'];
var my_string = "foo bar";
console.log(search.reduce(function(tillNow, now) {
return tillNow + (my_string.indexOf(now) !== -1);
}, 0));
答案 3 :(得分:0)
基于亚历克斯答案的更可重复的答案是:
searchString = 'hello world, roger';
searchTokens = ['foo', 'bar', 'roger'];
searchRegex = new RegExp(searchTokens.join('|'), 'g');
numOfMatches = searchString.match(searchRegex).length;