Codewars Tutorial — 7kyu: Помогите Бобу считать буквы и цифры.

Мое решение и объяснение ката кодовых войн



Инструкции:

Боб — ленивый человек.

Ему нужно, чтобы вы создали метод, который может определить, сколько букв и цифр содержится в заданной строке.

Пример:

ввод → вывод
«hel2!lo» → 6
«злой .. !» → 6
«!?..А» → 1

Мое решение:

function countLettersAndDigits(input) {
const patt = /[0–9]|[az]|[A–Z]/g;
return (input.match(patt)||[]).length;

}

Объяснение:

const patt = /[0–9]|[az]|[A–Z]/г;

  • Сначала я установил const для шаблона, используя RegExp (регулярное выражение - источник w3schools.com)
  • [0–9] найдет любые цифры от 0 до 9
  • [a-z] найдет любые символы между строчными буквами az
  • [A-Z] найдет любые символы между прописными буквами A-Z
  • /g выполнит глобальный поиск в строке

return (input.match(patt)||[]).length;

  • Затем используйте функцию match() с переменной RegExp patt в качестве аргумента, чтобы найти все совпадающие символы в строке и создать массив со значениями.
  • «hel2!lo» → [‘h’, ‘e’, ‘l’, ‘2’, ‘l’, ‘o’]
  • Здесь у меня возникла проблема, потому что я думал, что могу использовать свойство .length для подсчета массива, однако продолжал получать сообщение об ошибке NULL …
  • Я использовал своего любимого репетитора… АКА Google и нашел этот ответ StackOverflow — https://stackoverflow.com/questions/6715025/regexp-match-length-returns-null-if-not-found/6715069#6715069

return (input.match(patt)||[]).length;

  • || это оператор ИЛИ, который будет оценивать слева направо, какие подвыражения верны.
  • Теперь свойство .length будет считать массив и давать нужный ответ.
  • «hel2!lo» → [‘h’, ‘e’, ‘l’, ‘2’, ‘l’, ‘o’] → 6