【问题标题】:Word counter in javascriptjavascript中的单词计数器
【发布时间】:2019-03-26 21:56:23
【问题描述】:

我正在为一个 Web 应用程序课程做一个实验作业,并且一直在为一个基本的 HTML 网页实现一个字数计数器。测试和 HTML 的设置已经为我们完成。我只需要编写一个名为 countWords 的函数,它接受一个字符串并返回单词的数量。不过,它的工作方式与您的传统单词计数器不同。一个词被定义为任何 A-Z。其他一切都被认为不是单词的一部分。所以,如果字符串只是"234@#$^",那么字数就是0。所以,我不只是像大多数字计数器一样计算空白。我在 StackOverflow 上找到的所有类似问题的答案都试图只计算空白,不适用于我的情况。因此我提出了一个新问题。

我的想法是使用正则表达式匹配任何 a-z 分组并返回长度的 return 语句。然后,有一个条件来检查空字符串或没有字母 a-z 的字符串。

function countWords(s) {
   if(s === "" || s === "%$#^23#") {
      return 0
   }
   return s.match(/[^a-z]/gi).length
}

现在 if 语句只是匹配两个测试用例,这样我就可以通过我的测试。我不确定如何编写另一个匹配正则表达式来检查字符串中是否没有字母或空字符串。任何帮助表示赞赏!卡了一段时间。

【问题讨论】:

  • 你只需要s.match(/[a-z]+/gi).length就够了吗?
  • 我试过了,但问题是当字符串为"""%$#^23#" 时,它似乎没有通过我的测试。在这些情况下,它应该返回 0,但事实并非如此。
  • 包含变音符号等的单词呢...?您的实验室不认为这些是有效单词/名称的一部分?
  • @RokoC.Buljan 据我了解,教授正在考虑将任何带有 A-Z 字母且未被空格打断的单词作为单词。我猜他不包括变音符号之类的。这只是一个让我们使用正则表达式的基本实验室。它并不意味着是一个正常运行的网站或任何东西。
  • @PatrickConboy 我猜对了,我对这样的教授很生气。他们在 w3schools 水平上教学生,而不是正确地教他们。按上述要求进行正则表达式绝对合法,但应明确将其视为严格属性名称的正则表达式解析器,其中无论如何都禁止特殊字符,而不是“看,这是解析文本内容的方法,words!”...

标签: javascript regex string


【解决方案1】:
const str1 = '%$#^23#';
const str2 = 'String with  ___ special characters and @$&# white spaces  !!!';
const str3 = 'Special &$%# characters --> and %$#^5# connected,words but our <++@@||++> function,still_works!';

const wordCount = (str) => str.replace(/[\W_\d]/g,' ').split(' ').filter(Boolean).length;

console.log(wordCount(str1)); // 0
console.log(wordCount(str2)); // 7
console.log(wordCount(str3)); // 11
  1. 使用“正则表达式”将所有特殊字符、下划线、数字和多余的空格替换为空格

    --> 替换(/[\W_\d]/g,' ')

  2. 将字符串转换为数组

    --> .split(' ')

  3. 使用过滤器删除数组中的所有空字符串

    --> .filter(布尔值)

  4. 然后,用“length”获取字数

    --> .length

【讨论】:

    【解决方案2】:

    首先需要过滤string,去掉所有特殊字符和数字:

    var filtered_test = my_text.replace(/[^a-zA-Z ]/g, '');
    

    然后做一个普通的split 并计数:

    var words = filtered_test.split(" ");
    console.log(words.length); //prints out the count of words
    

    【讨论】:

    • 它将通过"Hello&amp;$&amp;$&amp;",这是 OP 不想要的
    • Ramy...let's是多少字比?更不用说名称,包含无数 utf8 字符的单词......
    • 不,"Hello&amp;$&amp;$&amp;" 在这种情况下会被计为一个词,对吧?这将符合我需要的功能。
    • @RokoC.Buljan 应用上述正则表达式将被计为 1 个单词,因为“'”将被过滤掉。
    • @smac89 "Hello&amp;&amp;$$&amp;" 将缩小为 "Hello"
    【解决方案3】:

    您可以使用功能替换方法将所有“单词”分块到一个数组中,然后简单地返回数组长度。这具有提供0 计数的额外好处:


    解释版:

    function countWords(str, words = []) {
      str.replace(/[A-Z]+/gi, (m) => words.push(m));
      return words.length;
    }
    

    最小版本:

    let countWords = (str, words = []) => 
        ( str.replace(/[A-Z]+/gi, (m) => words.push(m)), words.length );
    

    let countWords = (str, words = []) => (str.replace(/[A-Z]+/gi, (m) => words.push(m)), words.length);
    
    console.log( "##asdfadf###asfadf: " + countWords("##asdfadf###asfadf") )
    console.log("##13424#$#$#$%: " + countWords("##13424#$#$#$%"));

    【讨论】:

      【解决方案4】:

      这个正则表达式怎么样:/.*?[a-z]+.*?(\s|$)/gi

      使用return s.match(/.*?[a-z]+.*?(\s|$)/gi).length

      包含至少 1 个字母的任何内容都会被计算在内。那么短语O##ne two $#!+ @#%Three four^&amp;&amp;$ five 将计为5 个单词。

      编辑:如果你想在有 0 个匹配项时通过测试用例,请使用 (input.match(/.*?[a-z]+.*?(\s|$)/gi) || "").length

      【讨论】:

      • 令人沮丧的是,这确实按预期正确计算了单词,但由于某种原因它没有通过测试。很奇怪。我可能会看看是否可以对其进行调整,使其通过编写的测试。
      • 已编辑答案以包含空合并运算符,因此不会为您的测试用例抛出空错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2017-05-30
      • 2014-12-29
      • 2011-09-26
      • 2012-02-03
      • 2019-09-13
      相关资源
      最近更新 更多