【问题标题】:Count number of word occurrences, allowing for special characters and linebreaks计算单词出现的次数,允许特殊字符和换行符
【发布时间】:2017-07-29 00:24:38
【问题描述】:

我正在尝试构建一个函数来计算一个词在短语中出现的次数。

该功能应包括短语中的单词具有额外的非字母字符和/或行尾字符的情况。

function countWordInText(word,phrase){
    var c=0;
    phrase = phrase.concat(" ");
    regex = (word,/\W/g);
    var fChar = phrase.indexOf(word);
    var subPhrase = phrase.slice(fChar);

    while (regex.test(subPhrase)){
        c += 1;
        subPhrase = subPhrase.slice((fChar+word.length));
        fChar = subPhrase.indexOf(word);
    }
    return c;
}

问题是对于一个简单的值,比如

phrase = "hi hi hi all hi. hi";
word = "hi"
// OR
word = "hi all";

它返回错误值。

【问题讨论】:

    标签: javascript node.js regex count find-occurrences


    【解决方案1】:

    您编写的算法表明您花了一些时间试图让它发挥作用。但是,仍然有很多地方不起作用。例如,(word,/W/g) 实际上并没有创建您可能认为的正则表达式。

    还有一个更简单的方法:

    function countWordInText (word, phrase) {
      // Escape any characters in `word` that may have a special meaning
      // in regular expressions.
      // Taken from https://stackoverflow.com/a/6969486/4220785
      word = word.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&')
    
      // Replace any whitespace in `word` with `\s`, which matches any
      // whitespace character, including line breaks.
      word = word.replace(/\s+/g, '\\s')
    
      // Create a regex with our `word` that will match it as long as it
      // is surrounded by a word boundary (`\b`). A word boundary is any
      // character that isn't part of a word, like whitespace or
      // punctuation.
      var regex = new RegExp('\\b' + word + '\\b', 'g')
    
      // Get all of the matches for `phrase` using our new regex.
      var matches = phrase.match(regex)
    
      // If some matches were found, return how many. Otherwise, return 0.
      return matches ? matches.length : 0
    }
    
    countWordInText('hi', 'hi hi hi all hi. hi') // 5
    
    countWordInText('hi all', 'hi hi hi all hi. hi') // 1
    
    countWordInText('hi all', 'hi hi hi\nall hi. hi') // 1
    
    countWordInText('hi all', 'hi hi hi\nalligator hi. hi') // 0
    
    countWordInText('hi', 'hi himalayas') // 1
    

    我在整个示例中都使用了 cmets。希望这可以帮助您入门!

    这里有几个学习 Javascript 正则表达式的好地方:

    您还可以使用Regexr 实时测试您的正则表达式。

    【讨论】:

    • 我能说什么呢?昨天我为此挣扎了好几个小时。我不完全理解代码,但推荐会很有帮助!非常感谢!
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多