【问题标题】:Searching for list of words occurrences in a string?搜索字符串中出现的单词列表?
【发布时间】:2014-03-25 01:51:30
【问题描述】:

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

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

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

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

最好的方法是什么?常用表达?还有什么黑魔法?

看起来应该很容易,但我一点也不知道如何以一种能让 Google 理解的方式来表达它。 ;)

【问题讨论】:

  • 我认为您需要更好地定义问题。你对多少字感兴趣?您是否对整个单词、相关单词(比如工作、工作、工人)、任何子字符串感兴趣?我们知道您对推文感兴趣,但是您要检查多少条推文?你要找多少字?这些问题以及可能更多问题的答案将有助于确定您将如何进行搜索。

标签: javascript regex arrays string node.js


【解决方案1】:

最好的方法是什么?常用表达?还有什么黑魔法?

这里没有黑魔法,只有正则表达式。

"hello world, roger".match(/foo|bar|roger/g).length 应该这样做。

【讨论】:

  • 除了“Kroger”可能不应该生成匹配项。
  • 如果不应该,请将其更改为 match(/\b(foo|bar|roger)\b/g)
【解决方案2】:

注意事项:正则表达式在处理复杂的事情时非常快,但在处理很多简单的事情时却非常慢。在这种情况下,如果 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);

【讨论】:

    【解决方案3】:

    一种功能性的方式,用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));
    

    【讨论】:

    • 你能把这个放在一个 jsfiddle 例子中吗?
    【解决方案4】:

    基于 alex 的答案更可重用的答案是:

    searchString = 'hello world, roger';
    searchTokens = ['foo', 'bar', 'roger'];
    
    searchRegex  = new RegExp(searchTokens.join('|'), 'g');
    numOfMatches = searchString.match(searchRegex).length;
    

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2019-01-05
      • 1970-01-01
      • 2011-12-27
      相关资源
      最近更新 更多