在字符串中搜索单词出现的列表?

时间:2014-02-23 15:25:10

标签: javascript regex arrays string node.js

在我的Node.js应用程序中,我有一个数组中的单词列表我想看看是否有任何随机字符串(实际上是一条推文。)我不一定关心哪个单词出现以及它们出现的频率,我只想多次出现在字符串中的任何单词。

所以,例如,如果我有一个数组:

search = ['foo', 'bar', 'roger'];

我有一个字符串"foo bar",我想要2的回复。如果我有一个字符串"hello world, roger", 我想要1的回复。等等。

最好的方法是什么?常用表达?其他一些黑魔法?

看起来它应该很容易,但我对于如何以一种让Google理解它的方式来表达它并不是最微妙的想法。 ;)

4 个答案:

答案 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)

功能方式,Array.prototype.reduce

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;