Счетчик слов в javascript

#javascript #regex #string

#javascript #регулярное выражение #строка

Вопрос:

Я работаю над лабораторным заданием для класса веб-приложений и застрял на реализации счетчика слов для базовой веб-страницы HTML. Настройка тестов и HTML-кода уже выполнена за нас. Мне просто нужно написать функцию с именем countWords, которая принимает строку и возвращает количество слов. Однако он работает иначе, чем ваш традиционный счетчик слов. Слово определяется как что угодно от А доЯ. Все остальное считается не частью слова. Итак, если строка просто "234@#$^" , то количество слов равно 0. Итак, я не просто считаю пробелы, как большинство счетчиков слов. Все ответы, которые я нашел в StackOverflow на похожие вопросы, пытаются просто считать пробелы и не работают в моей ситуации. Следовательно, почему я задал новый вопрос.

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

 function countWords(s) {
   if(s === "" || s === "%$#^23#") {
      return 0
   }
   return s.match(/[^a-z]/gi).length
}
  

Прямо сейчас оператор if просто сопоставляет два тестовых примера, чтобы я мог пройти свои тесты. Я не уверен, как написать другое регулярное выражение match, чтобы проверить, нет ли букв в строке или пустой строки. Любая помощь приветствуется! Застрял на некоторое время.

Комментарии:

1. Конечно, только s.match(/[a-z] /gi).length это все, что вам нужно?

2. Я пробовал это, но проблема в том, что, похоже, он не проходит мои тесты на то, когда строка является "" или "%$#^23#" . В этих случаях он должен возвращать 0, но это не так.

3. Как насчет слов, содержащих умляуты и т.д.? Ваша лаборатория не рассматривает их как часть допустимых слов / имен?

4. @RokoC. Buljan насколько я понимаю, профессор рассматривает все, что состоит из букв A. Z и не разделено пробелом, как слово. Я собираюсь предположить, что он не включает умляуты и тому подобное. Это всего лишь базовая лабораторная работа, позволяющая нам работать с регулярными выражениями. Это не должно быть функционирующим веб-сайтом или чем-то еще.

5. @PatrickConboy Я угадал правильно, и я зол на таких профессоров. Они обучают студентов на уровне w3schools, вместо того, чтобы учить их правильно. Регулярное выражение в соответствии с вышеуказанным требованием абсолютно законно, но его следует явно рассматривать как анализатор регулярных выражений для строгих имен свойств, где специальные символы в любом случае запрещены, а не как «Посмотрите, вот как вы можете разобрать textcontent, слова !»…

Ответ №1:

 const str1 = '%$#^23#';
const str2 = 'String with  ___ special characters and @$amp;# white spaces  !!!';
const str3 = 'Special amp;$%# characters --> and %$#^5# connected,words but our <  @@||  > function,still_works!';

const wordCount = (str) => str.replace(/[W_d]/g,' ').split(' ').filter(Boolean).length;

console.log(wordCount(str1)); // 0
console.log(wordCount(str2)); // 7
console.log(wordCount(str3)); // 11
  
  1. используйте «regex» для замены всех специальных символов, подчеркиваний, цифр и лишних пробелов на пустое место

    —> заменить(/[W_d]/g,’ ‘)

  2. преобразуйте строку в массив

    —> .split(‘ ‘)

  3. используйте фильтр, чтобы удалить все пустые строки в массиве

    —> .filter(логическое значение)

  4. затем получите количество слов с «длиной»

    —> .длина

Ответ №2:

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

 var filtered_test = my_text.replace(/[^a-zA-Z ]/g, '');
  

затем выполните обычное split и посчитайте:

 var words = filtered_test.split(" ");
console.log(words.length); //prints out the count of words
  

Комментарии:

1. Он пройдет "Helloamp;$amp;$amp;" , чего OP не хочет

2. Рами… let's это сколько слов, чем? Не говоря уже об именах, словах, содержащих множество символов utf8…

3. Нет, "Helloamp;$amp;$amp;" в этом случае это будет считаться как одно слово, верно? Это соответствовало бы функциональности, которая мне нужна.

4. @RokoC. Buljan это будет засчитано как 1 слово, применяющее вышеупомянутое регулярное выражение, поскольку «‘ » будет отфильтровано.

5. размер @smac89 "Helloamp;amp;$$amp;" был бы уменьшен до "Hello"

Ответ №3:

Вы можете использовать функциональный метод замены, чтобы поместить все «слова» в массив, а затем просто вернуть длину массива. Это имеет дополнительное преимущество в предоставлении 0 количества:


пояснительная версия:

 function countWords(str, words = []) {
  str.replace(/[A-Z] /gi, (m) => words.push(m));
  return words.length;
}
  

минимальная версия:

 let countWords = (str, words = []) => 
    ( str.replace(/[A-Z] /gi, (m) => words.push(m)), words.length );
  

 let countWords = (str, words = []) => (str.replace(/[A-Z] /gi, (m) => words.push(m)), words.length);

console.log( "##asdfadf###asfadf: "   countWords("##asdfadf###asfadf") )
console.log("##13424#$#$#$%: "   countWords("##13424#$#$#$%"));  

Ответ №4:

Как насчет этого регулярного выражения: /.*?[a-z] .*?(s|$)/gi

Использовать return s.match(/.*?[a-z] .*?(s|$)/gi).length

Учитывается все, что содержит хотя бы 1 букву. Тогда фраза O##ne two $#! @#%Three four^amp;amp;$ five будет считаться как 5 слов.

Редактировать: Если вы хотите быть злым, чтобы пройти свои тестовые случаи, когда совпадений 0, используйте (input.match(/.*?[a-z] .*?(s|$)/gi) || "").length

Комментарии:

1. К сожалению, это правильно подсчитывает слова, как и предполагалось, но по какой-то причине не проходит тесты. Очень странно. Я мог бы посмотреть, смогу ли я настроить его так, чтобы он проходил написанные тесты.

2. Отредактированный ответ, чтобы включить оператор объединения null, чтобы ошибка null не выдавалась для ваших тестовых случаев