Подтвердить что ты не робот

Как определить, является ли символ буквой ASCII в верхнем регистре в Clojure

У меня получилось так:

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

Я хочу отфильтровать в нем прописные буквы ASCII, такие как \A и\Z

Я попытался найти стандартную библиотеку, но не повезло.

Может кто-нибудь мне помочь?

4b9b3361

Ответ 1

Используйте следующие

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

Результаты: (\A \Z)

Ответ 2

Мое решение:

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

Возврат:

'(\A \Z)

Ответ 3

Или вы также можете использовать re-seq и регулярные выражения:

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

который также возвращает (\A \Z).

Ответ 4

Это более подробно, но вы также можете определить свою собственную функцию:

(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)