(Clojure) Подсчитайте, сколько раз любой символ появляется в строке

Я пытаюсь написать функцию (счетчик символов), которая принимает шаблон и строку, а затем возвращает число (количество), которое представляет, сколько раз любой из символов шаблона появляется в строке.

Например:

(char-count "Bb" "Best buy")

вернется, так как есть 1 совпадение дляBи 1 матч дляb, так что сложив вместе, мы получим2

(char-count "AaR" "A Tale of Recursion")

вернется3и так далее


я пытался использоватьre-seqв моей функции, но, похоже, она работает только для непрерывных строк. Как в(re-seq #Bb "Best Buy)ищет только образецBb, а не для каждого отдельного символа.

Вот как выглядит моя функция до сих пор:

      (defn char-count [pattern text]
  (count (re-seq (#(pattern)) text)))

Но он не делает то, что я хочу. Кто-нибудь может помочь?

Ps Совсем новичок в clojure (и вообще в функциональном программировании).

2 ответа

Здесь вам не нужно ничего столь же мощного, как регулярное выражение, поэтому просто используйте простые инструменты, которые есть в вашем языке программирования: наборы и функции. Создайте набор символов, которые вы хотите найти, и подсчитайте, сколько символов из входной строки находится в наборе.

      (defn char-count [chars s]
  (count (filter (set chars) s)))

Попробуйте заключить символы в[...]в регулярном выражении:

      (count (re-seq #"[Bb]" "Best buy"))

Или, поскольку вам нужно, чтобы этот шаблон был динамическим:

      (count (re-seq (re-pattern (str "[" pattern "]")) text))

Но учтите, что решение может работать некорректно, если шаблон содержит специальные символы RegEx, такие как[,],\,-,^- вам нужно будет избежать их, добавив\\перед каждым.

Другие вопросы по тегам