我有一个这样的序列:
(\$ \# \A \( \* \& \9 \8 \7 \Z \f)
我想过滤掉其中的大写 ASCII 字母,如 \A 和 \Z
我试图在标准库中查找,但没有运气。
有谁能够帮助我?
使用以下
(filter #(Character/isUpperCase %) `(\$ \# \A \( \* \& \9 \8 \7 \Z \f))
结果 :(\A \Z)
我的解决方案:
(filter (set (map char (range 65 91)))
'(\$ \# \A \( \* \& \9 \8 \7 \Z \f))
回报:
'(\A \Z)
或者你也可以使用re-seq
和正则表达式:
((fn [x]
(seq (apply str (re-seq #"[A-Z]" (apply str x)))))
'(\$ \# \A \( \* \& \9 \8 \7 \Z \f))
这也返回(\A \Z)
。
这更冗长,但您也可以定义自己的函数来执行此操作:
(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))))))
并使用您的字符序列调用 thecap-detector
将为您提供所需的内容:
(cap-detector '(\$ \# \A \( \* \& \9 \8 \7 \Z \f))
; => (\A \Z)