使用 JavaScript 准确计算字数的正则表达式

Posted

技术标签:

【中文标题】使用 JavaScript 准确计算字数的正则表达式【英文标题】:Regular Expression for accurate word-count using 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,一般缺失,还是问题中缺失? ;) 【参考方案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(/\pL+/gu).length

【讨论】:

这可能是比这里已经存在的其他一些更好的答案,但它确实有助于解释 \pL 的作用以及为什么它可以更好地解决问题。

以上是关于使用 JavaScript 准确计算字数的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript正则表达式

javascript 正则表达式总结

正则表达式-JavaScript 密码测试

javascript正则表达式

系统认识JavaScript正则表达式

javaScript正则表达式