#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
-
используйте «regex» для замены всех специальных символов, подчеркиваний, цифр и лишних пробелов на пустое место
—> заменить(/[W_d]/g,’ ‘)
-
преобразуйте строку в массив
—> .split(‘ ‘)
-
используйте фильтр, чтобы удалить все пустые строки в массиве
—> .filter(логическое значение)
-
затем получите количество слов с «длиной»
—> .длина
Ответ №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 не выдавалась для ваших тестовых случаев