Регулярное выражение для точного подсчета слов с использованием JavaScript
Я пытаюсь собрать регулярное выражение для команды 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 слово даже с пустым документом. Кроме того, если документ начинается с пробела, считается постороннее слово.
Есть ли в этой команде регулярное выражение, которое точно подсчитывает слова, независимо от метода ввода?
9 ответов
Это должно сделать то, что вы после:
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 или более символов или префиксный класс символов
Я рекомендую изучать регулярные выражения. Это отличный навык, потому что они такие мощные.;-)
Пытаться
value.match(/\w+/g).length;
Это будет соответствовать строке символов, которые могут быть в слове. Тогда как что-то вроде:
value.match(/\S+/g).length;
приведет к неправильному подсчету, если пользователь добавит запятые или другие знаки пунктуации, за которыми не будет пробел, или добавит запятую с пробелом по обе стороны от нее.
Правильное регулярное выражение будет /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
для юникода
Источник: HTTP://www.regular-expressions.info/charclass.html
Моя простая библиотека JavaScript, называемая FuncJS, имеет функцию count(), которая выполняет именно то, что называется - подсчет слов.
Например, скажем, что у вас есть строка, полная слов, вы можете просто поместить ее между скобками функций, например так:
count("How many words are in this string?");
а затем вызвать функцию, которая затем вернет количество слов. Кроме того, эта функция предназначена для игнорирования любого количества пробелов, что дает точный результат.
Чтобы узнать больше об этой функции, ознакомьтесь с документацией по адресу http://docs.funcjs.webege.com/count().html Ссылка для загрузки FuncJS также находится на странице.
Надеюсь, это поможет всем, кто хочет это сделать!:)
Если 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