Регулярное выражение для точного подсчета слов с использованием 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 слово даже с пустым документом. Кроме того, если документ начинается с символа пробела, подсчитывается постороннее слово.
Есть ли регулярное выражение, которое я могу поместить в эту команду, которая точно подсчитывает слова, независимо от метода ввода?
Ответы
Ответ 1
Это должно делать то, что вам нужно:
value.match(/\S+/g).length;
Вместо того, чтобы разбивать строку, вы соответствуете любой последовательности символов без пробелов.
Там добавлен бонус, позволяющий легко извлекать каждое слово, если это необходимо;)
Ответ 2
Попробуйте подсчитать все, что не является пробелом и границей слов:
value.split(/\b\S+\b/g).length
Вы также можете попробовать использовать диапазоны юникода, но я не уверен, завершено ли следующее:
value.split(/[\u0080-\uFFFF\w]+/g).length
Ответ 3
Правильное регулярное выражение будет /s+/
, чтобы отменить не-слова:
'Lorem ipsum dolor , sit amet'.split(/\S+/g).length
7
'Lorem ipsum dolor , sit amet'.split(/\s+/g).length
6
Ответ 4
вы можете расширить или изменить свои методы, подобные этому
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
Источник: HTTP://www.regular-expressions.info/charclass.html
Ответ 5
Try
value.match(/\w+/g).length;
Это будет соответствовать строке символов, которые могут быть в слове. Если что-то вроде:
value.match(/\S+/g).length;
приведет к некорректному подсчету, если пользователь добавит запятую или другую пунктуацию, за которой не следует пробел, или добавляет запятую с пространством с каждой ее стороны.
Ответ 6
Для меня это дало наилучшие результаты:
value.split(/\b\W+\b/).length
с
var words = value.split(/\b\W+\b/)
вы получаете все слова.
Пояснение:
- \b - граница слова
- \W является символом NON-word, капитал обычно означает отрицание
- '+' означает 1 или более символов или префиксный класс символов
Я рекомендую изучать регулярные выражения. Это большой навык, потому что они настолько могущественны.; -)
Ответ 7
my простая библиотека JavaScript, называемая FuncJS, имеет функцию "count()", которая выполняет именно то, что она называла, - считать слова.
Например, скажем, что у вас есть строка, полная слов, вы можете просто разместить ее между функциональными скобками, например:
count("How many words are in this string?");
а затем вызовите функцию, которая затем вернет число слов. Кроме того, эта функция предназначена для игнорирования любого количества пробелов, что дает точный результат.
Чтобы узнать больше об этой функции, прочитайте документацию на http://docs.funcjs.webege.com/count().html и ссылка на скачивание для FuncJS также находится на странице.
Надеюсь, это поможет любому, кто хочет это сделать!:)
Ответ 8
Если JavaScript понимает класс препинания [[:punct:]]
и утверждение lookahead (?=)
то это должно получить все слова:
/[\s[:punct:]]*(\w(?:\w|[[:punct:]](?=[\w[:punct:]]))*)/
или, если у вас нет (?:) construct...
/[\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 "scientifically" sound,
and that appropriate conclusion 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