使用 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")==1
、count("you & I")==2
、count("you - and I")==3
、count("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 准确计算字数的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章