我正在尝试为JavaScript命令组合一个正则表达式,以准确计算textarea中的单词数。
我找到的一个解决方案如下:
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个单词。此外,如果文档以空格字符开头,则会计算无关的单词。
我是否可以在此命令中使用正则表达式,无论输入法如何,都能准确计算单词?
答案 0 :(得分:36)
这应该做你想要的事情:
value.match(/\S+/g).length;
不是拆分字符串,而是匹配任何非空白字符序列。
如果需要,还可以轻松提取每个单词;)
答案 1 :(得分:7)
尝试计算任何不是空格和字边界的东西:
value.split(/\b\S+\b/g).length
您也可以尝试使用unicode范围,但我不确定以下内容是否完整:
value.split(/[\u0080-\uFFFF\w]+/g).length
答案 2 :(得分:4)
对我来说,这给了最好的结果:
value.split(/\b\W+\b/).length
与
var words = value.split(/\b\W+\b/)
你得到所有的话。
说明:
我建议学习正则表达式。这是一项非常棒的技能,因为它们非常强大。 ; - )
答案 3 :(得分:2)
正确的正则表达式为/s+/
,以便丢弃非单词:
'Lorem ipsum dolor , sit amet'.split(/\S+/g).length
7
'Lorem ipsum dolor , sit amet'.split(/\s+/g).length
6
答案 4 :(得分:1)
你可以扩展/改变你这样的方法
document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.split(/\b\(.*?)\b/).length -1;
如果您想匹配电子邮件地址等内容
和
document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.trim().split(/\s+/g).length -1;
还尝试使用\s
作为unicode的\w
出处:http://www.regular-expressions.info/charclass.html
答案 5 :(得分:1)
尝试
value.match(/\w+/g).length;
这将匹配一个单词中可以包含的字符串。而类似的东西:
value.match(/\S+/g).length;
如果用户添加逗号或其他没有空格的标点符号,将导致错误计数 - 或者在其两侧添加逗号并添加逗号。
答案 6 :(得分:0)
我的简单 JavaScript库,名为FuncJS,它有一个名为“count()”的函数,它完全符合它所谓的 - 计数单词。
例如,假设你有一个充满单词的字符串,你可以简单地将它放在函数括号之间,如下所示:
count("How many words are in this string?");
然后调用该函数,然后返回单词数。此外,此功能旨在忽略任何数量的空白,从而提供准确的结果。
要了解有关此功能的更多信息,请阅读http://docs.funcjs.webege.com/count().html上的文档,并在页面上找到FuncJS的下载链接。
希望这有助于任何想要这样做的人! :)
答案 7 :(得分:-2)
如果JavaScript理解标点符号类[[:punct:]]
和前瞻断言(?=)
那么这应该得到所有的话:
/[\s[:punct:]]*(\w(?:\w|[[:punct:]](?=[\w[:punct:]]))*)/
或者,如果你没有(?:)构造......
/[\s[:punct:]]*(\w(\w|[[:punct:]](?=[\w[:punct:]]))*)/
在Perl中使用它会是这样的:
# Extracting and count the number of words
#
use strict;
use warnings;
my $text = q(
I confirm that sufficient information and detail have been
reported in this technical report, that it's "scientifically" sound,
and that appropriate conclusion's have been included
);
my $regex = qr/ [\s[:punct:]]* (\w (?: \w | [[:punct:]](?=[\w[:punct:]]) )* ) /x;
my $wordcount = 0;
while ( $text =~ /$regex/g )
{
print "$1\n";
$wordcount++;
}
print "\n", '-'x20, "\nFound $wordcount words\n\n";
输出:
I
confirm
that
sufficient
information
and
detail
have
been
reported
in
this
technical
report
that
it's
scientifically
sound
and
that
appropriate
conclusion's
have
been
included
--------------------
Found 25 words