Регулярное выражение для точного подсчета слов с помощью 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