【问题标题】:Regular Expression for accurate word-count using JavaScript使用 JavaScript 准确计算字数的正则表达式
【发布时间】:2011-06-03 08:59:49
【问题描述】:

我正在尝试为 JavaScript 命令组合一个正则表达式,以准确计算文本区域中的单词数。

我找到的一个解决方案如下:

document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.split(/\b\w+\b/).length -1;

但这不包括任何非拉丁字符(例如:西里尔文、韩文等);它完全跳过它们。

我整理的另一个:

document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.split(/\s+/g).length -1;

但除非文档以空格字符结尾,否则这并不能准确计算。如果将空格字符附加到被计数的值,即使是空文档,它也会计数 1 个单词。此外,如果文档以空格字符开头,则计算无关单词。

无论输入法如何,我都可以在这个命令中输入一个正则表达式来准确计算单词吗?

【问题讨论】:

  • 跑题了,不过document.querySelector("#wordcount")可以写成document.getElementById("wordcount"),可能是跨浏览器兼容性更好,也可能更快;它不太可能兼容或变慢。
  • 缺少对术语“单词”的准确定义。
  • @Tomalak,一般缺失,还是问题中缺失? ;)

标签: javascript regex word-count


【解决方案1】:

这应该做你所追求的:

value.match(/\S+/g).length;

您不是拆分字符串,而是匹配任何非空白字符序列。

如果需要,可以轻松提取每个单词的额外好处 ;)

【讨论】:

  • 谢谢。一个问题。当没有单词时,使用 match 而不是 split 返回 null,即使有空格字符也是如此。我可以使用 if/else 命令来解决这个问题,但有没有更好的方法?
  • 我想知道 OP 对将you-and-I 视为一个词,或将you & I 视为三个词或将you - and I 视为四个词的感觉如何。
  • @Haidon 如果您将来自.match() 的返回值存储在var words 然后length = words && words.length || 0
  • 嗨,有人知道“32 43.43 ...”的正则表达式吗(60 个数字,以空格分隔)?谢谢
  • +1 谢谢你,因为它有效,但我要求你将你的更改为 value.match(/\b\S+\b/g).length 因为它不计算标点符号。例如使用 /\S+/g 计算“?”在它前面留一个空格作为你不想要的单词。
【解决方案2】:

尝试计算任何不是空格且带有单词边界的内容:

value.split(/\b\S+\b/g).length

您也可以尝试使用 unicode 范围,但我不确定以下是否完整:

value.split(/[\u0080-\uFFFF\w]+/g).length

【讨论】:

  • value.split 是错误的方法,但如果您改为使用(value.match(/\b\S+\b/g) || []).length,则效果很好。我发现 Phrogz 关于已接受答案的示例是一个有用的测试;这给出:count("you-and-I")==1count("you & I")==2count("you - and I")==3count("Phrogz's examples")==2。唯一值得怀疑的是you-and-I,但这种结构非常罕见,因此额外的复杂性可能不值得,尤其是要确保所有格正确。
【解决方案3】:

对我来说,这是最好的结果:

value.split(/\b\W+\b/).length

var words = value.split(/\b\W+\b/)

你会得到所有的单词。

解释:

  • \b 是单词边界
  • \W 是非单词字符,大写通常表示否定
  • '+'表示1个或多个字符或前缀字符类

我建议学习正则表达式。这是一项很棒的技能,因为它们非常强大。 ;-)

【讨论】:

    【解决方案4】:

    试试

        value.match(/\w+/g).length;
    

    这将匹配一个可以在单词中的字符串。而类似的东西:

        value.match(/\S+/g).length;
    

    如果用户添加逗号或其他没有空格的标点符号 - 或在逗号的两侧添加一个空格,则会导致计数不正确。

    【讨论】:

      【解决方案5】:

      正确的正则表达式是/s+/,以便丢弃非单词:

      'Lorem ipsum dolor , sit amet'.split(/\S+/g).length
      7
      'Lorem ipsum dolor , sit amet'.split(/\s+/g).length
      6
      

      【讨论】:

      • 你真的认为逗号应该算一个单词?
      • ' , , , , ' 根据您的解决方案有 5 个字:D
      【解决方案6】:

      你可以像这样扩展/改变你的方法

      document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.split(/\b\<strong>(.*?)</strong>\b/).length -1; 如果您还想匹配电子邮件地址等内容

      document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value<strong>.trim()</strong>.split(/\s+/g).length -1;

      也可以尝试使用 \s 作为 unicode 的 \w

      来源:http://www.regular-expressions.info/charclass.html

      【讨论】:

        【解决方案7】:

        我的 simple JavaScript 库,名为 FuncJS 有一个名为“count()”的函数,它完全按照它的名称 - 计算字数。

        例如,假设您有一个充满单词的字符串,您可以简单地将它放在函数括号之间,如下所示:

        count("How many words are in this string?");
        

        然后调用该函数,该函数将返回单词数。此外,此函数旨在忽略任何数量的空格,从而提供准确的结果。

        要了解更多关于这个函数的信息,请阅读http://docs.funcjs.webege.com/count().html 的文档,FuncJS 的下载链接也在页面上。

        希望这可以帮助任何想要这样做的人! :)

        【讨论】:

          【解决方案8】:
          const wordsCount = str.match(/\p{L}+/gu).length
          

          【讨论】:

          • 这可能是比这里已经存在的其他一些更好的答案,但它确实有助于解释 \p{L} 的作用以及为什么它可以更好地解决问题。
          猜你喜欢
          • 2012-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多