(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, такие как[
,]
,\
,-
,^
- вам нужно будет избежать их, добавив\\
перед каждым.