如何判断字符是否是Clojure中的ASCII大写字母

时间:2013-02-28 11:14:36

标签: clojure ascii

我得到了这样的seq:

(\$ \# \A \( \* \& \9 \8 \7 \Z \f)

我想过滤掉大写的ASCII字母,如\ A和\ Z

我试图在标准库中查找但没有运气。

有人能帮助我吗?

4 个答案:

答案 0 :(得分:20)

使用以下

(filter #(Character/isUpperCase %) `(\$ \# \A \( \* \& \9 \8 \7 \Z \f))

结果:(\A \Z)

答案 1 :(得分:2)

我的解决方案:

(filter (set (map char (range 65 91))) 
       '(\$ \# \A \( \* \& \9 \8 \7 \Z \f))

返回:

'(\A \Z)

答案 2 :(得分:1)

或者您也可以使用re-seq和正则表达式:

((fn [x] (seq (apply str (re-seq #"[A-Z]" (apply str x))))) '(\$ \# \A \( \* \& \9 \8 \7 \Z \f))

也返回(\A \Z)

答案 3 :(得分:0)

这更详细,但您也可以定义自己的功能:

(defn cap-detector [x]
     (loop [res []
            arg (apply str x)]
        (cond (empty? arg) (filter (fn [x] (Character/isLetter x)) res)
              :else (if (= (clojure.string/upper-case (first arg)) (str (first arg)))
                    (recur (conj res (first arg)) (rest arg))
                    (recur res (rest arg))))))

用你的字符序列调用cap-detector会给你你想要的东西:

(cap-detector '(\$ \# \A \( \* \& \9 \8 \7 \Z \f))
; => (\A \Z)