正则表达式,使用JavaScript进行准确的字数统计

时间:2011-01-04 12:28:50

标签: javascript regex word-count

我正在尝试为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个单词。此外,如果文档以空格字符开头,则会计算无关的单词。

我是否可以在此命令中使用正则表达式,无论输入法如何,都能准确计算单词?

8 个答案:

答案 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/)

你得到所有的话。

说明:

  • \ b是单词边界
  • \ W是一个非单词字符,资本通常意味着否定
  • ' +'表示1个或多个字符或带前缀的字符类

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

答案 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