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

      const wordsCount = str.match(/\p{L}+/gu).length

Моя простая библиотека 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
Другие вопросы по тегам