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

如何在Clojure中判断字符是否为ASCII大写字母,clojure,ascii,Clojure,Ascii,我有一张这样的序号: (\$ \# \A \( \* \& \9 \8 \7 \Z \f) 我想过滤掉其中的大写ASCII字母,如\A和\Z 我试着在标准图书馆里查找,但没有成功 有人能帮我吗?使用以下命令 (filter #(Character/isUpperCase %) `(\$ \# \A \( \* \& \9 \8 \7 \Z \f)) 结果:(\A\Z)这更详细,但您也可以定义自己的函数来执行此操作: (defn cap-detector [x] (l

我有一张这样的序号:

(\$ \# \A \( \* \& \9 \8 \7 \Z \f)
我想过滤掉其中的大写ASCII字母,如\A和\Z

我试着在标准图书馆里查找,但没有成功

有人能帮我吗?

使用以下命令

(filter #(Character/isUpperCase %) `(\$ \# \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))))))
然后用您的字符序列调用
cap检测器
,将得到您想要的:

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

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

((fn[x]
(顺序(应用str(re-seq#“[A-Z]”(应用str x()(#))))
“(\$\\\\A\(\*\&\9\8\7\Z\f))

它还返回
(\A\Z)

我的解决方案:

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

'(\A \Z)

谢谢。这是一个java函数哈哈。如果不使用java:
(filter#(not=(str%)(clojure.string/lower-case%)`(\$\\\a\(\*\&\9\8\7\Z\f))
假设
x
已经是一个字符串,最里面的
(apply str x)
可以替换为
x