Clojure实现char-count函数:统计模式字符在字符串中的出现次数
解决Clojure的char-count函数需求
你的问题出在对re-seq的用法理解上:直接把pattern作为正则表达式传入的话,re-seq会匹配整个pattern字符串(比如"Bb"会找连续的"Bb"子串),而不是单独匹配pattern里的每个字符。下面给你两种简单的实现方式:
方法一:用集合快速判断(推荐新手)
把pattern转成字符集合,遍历目标字符串的每个字符,筛选出属于集合的字符后统计数量:
(defn char-count [pattern text] (let [target-chars (set pattern)] (count (filter #(target-chars %) text))))
- 测试示例:
(char-count "Bb" "Best buy") ; 返回2 (char-count "AaR" "A Tale of Recursion") ; 返回3 - 逻辑说明:
(set pattern)将pattern字符串转换为字符集合,集合的成员查找效率很高filter遍历text的每个字符,只保留存在于集合中的字符- 最后用
count统计筛选后的字符总数
方法二:用正则表达式字符类
如果想用正则实现,需要把pattern包装成正则的字符类(用[]包裹),这样就能匹配pattern里的任意单个字符:
(defn char-count [pattern text] (count (re-seq (re-pattern (str "[" pattern "]")) text)))
- 测试示例和上面一致,结果正确
- 注意:如果pattern里包含正则特殊字符(比如
[、]、^等),需要额外转义,所以这种方法更适合pattern是普通字符的场景
内容的提问来源于stack exchange,提问作者Axoy
相关产品推荐
相关产品推荐

