Регулярное выражение для точного подсчета слов с помощью JavaScript

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

одно решение, которое я нашел, выглядит следующим образом:

document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.split(/bw+b/).length -1;

но это не учитывает никаких нелатинских символов (например: кириллица, хангыль и т. д.); Он полностью пропускает их.

еще один, который я собрал:

document.querySelector("#wordcount").innerHTML = document.querySelector("#editor").value.split(/s+/g).length -1;

но это не считается точно, если документ не заканчивается пробелом. Если пробел символ добавляется к подсчитываемому значению, он подсчитывает 1 слово даже с пустым документом. Кроме того, если документ начинается с символа пробела, подсчитывается постороннее слово.

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

8 ответов


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

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

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

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


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

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

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

value.split(/[\u0080-\uFFFF\w]+/g).length

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

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

С

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

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

объяснение:

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

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


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

'Lorem ipsum dolor , sit amet'.split(/\S+/g).length
7
'Lorem ipsum dolor , sit amet'.split(/\s+/g).length
6

вы можете расширить/изменить методы такой

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 и \w для unicode

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


попробовать

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

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

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

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


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

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

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

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

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

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


если JavaScript понимает класс пунктуации [[:punct:]] и утверждение lookahead (?=)
тогда это должно получить все слова:

/[\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 "\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