14

我有一个这样的序列:

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

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

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

有谁能够帮助我?

4

4 回答 4

20

使用以下

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

结果 :(\A \Z)

于 2013-02-28T11:25:17.440 回答
2

我的解决方案:

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

回报:

'(\A \Z)
于 2015-09-24T16:41:58.153 回答
1

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

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

这也返回(\A \Z)

于 2015-08-17T17:34:52.600 回答
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))))))

并使用您的字符序列调用 thecap-detector将为您提供所需的内容:

(cap-detector '(\$ \# \A \( \* \& \9 \8 \7 \Z \f))
; => (\A \Z)
于 2015-08-17T16:06:45.030 回答