Регулярное выражение для точного подсчета слов с использованием JavaScript - PullRequest
14 голосов
/ 04 января 2011

Я пытаюсь собрать регулярное выражение для команды 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 слово даже с пустым документом.Кроме того, если документ начинается с пробела, подсчитывается лишнее слово.

Можно ли добавить в эту команду регулярное выражение, которое подсчитывает слова точно, независимо от метода ввода?

Ответы [ 8 ]

36 голосов
/ 04 января 2011

Это должно сделать то, что вы после:

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

Вместо того, чтобы разбивать строку, вы подходите для любой последовательности непробельных символов.

Есть дополнительный бонус - возможность легко извлекать каждое слово при необходимости;)

7 голосов
/ 04 января 2011

Попробуйте посчитать все, что не является пробелом и имеет границу слова:

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

Вы также можете попробовать использовать диапазоны Юникода, но я не уверен, что следующий полный:

value.split(/[\u0080-\uFFFF\w]+/g).length
4 голосов
/ 09 апреля 2015

Для меня это дало лучшие результаты:

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

с

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

вы получите все слова.

Объяснение:

  • \ b - это граница слова
  • \ W - это символ, не состоящий из слов, прописные обычно означают отрицание
  • '+' означает 1 или более символов или класс префиксных символов

Рекомендую изучать регулярные выражения.Это отличный навык, потому что они такие мощные.; -)

2 голосов
/ 04 января 2011

Правильное регулярное выражение будет /s+/, чтобы отбросить не слова:

'Lorem ipsum dolor , sit amet'.split(/\S+/g).length
7
'Lorem ipsum dolor , sit amet'.split(/\s+/g).length
6
1 голос
/ 28 ноября 2013

Попробуйте

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

Это будет соответствовать строке символов, которые могут быть в слове. Тогда как что-то вроде:

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

приведет к неправильному счету, если пользователь добавит запятые или другие знаки пунктуации, за которыми не стоит пробел, или добавит запятую с пробелом по обе стороны от нее.

1 голос
/ 04 января 2011

вы можете расширить / изменить ваши методы, подобные этому

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 в качестве \w для Unicode

source: http://www.regular -expressions.info / charclass.html

0 голосов
/ 26 ноября 2012

my simple Библиотека JavaScript, называемая FuncJS, имеет функцию count (), которая выполняет именно то, что называется - подсчет слов.

Например, скажем, что у вас есть строка, полная слов, вы можете просто поместить ее между скобками функций, например:

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

и затем вызовите функцию, которая затем вернет количество слов. Кроме того, эта функция предназначена для игнорирования любого количества пробелов, что дает точный результат.

Чтобы узнать больше об этой функции, пожалуйста, прочитайте документацию на http://docs.funcjs.webege.com/count().html, и ссылка для загрузки FuncJS также находится на странице.

Надеюсь, это поможет всем, кто хочет это сделать! :)

0 голосов
/ 04 января 2011

Если 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
...