Вы, вероятно, хотите использовать встроенный re-seq
и встроенный в Clojure литерал регулярных выражений. Не связывайтесь с базовыми объектами Java, если у вас их тоже нет.
(doc re-seq)
clojure.core/re-seq
([re s])
Returns a lazy sequence of successive matches of pattern in string,
using java.util.regex.Matcher.find(), each such match processed with
re-groups.
</p>
<p>For example:</p>
<pre><code>user> (re-seq #"the \w+" "the cat sat on the mat")
("the cat" "the mat")
В ответ на последующий комментарий при групповом захвате будет получен вектор строк с элементом для каждой части группы в совпадении:
user> (re-seq #"the (\w+(t))" "the cat sat on the mat")
(["the cat" "cat" "t"] ["the mat" "mat" "t"])
Вы можете извлечь конкретный элемент, используя элегантный факт, что векторы являются функциями их индексов.
user> (defn extract-group [n] (fn [group] (group n)))
#'user/extract-group
user> (let [matches (re-seq #"the (\w+(t))" "the cat sat on the mat")]
(map (extract-group 1) matches))
("cat" "mat")
Или вы можете деструктурировать совпадения (здесь используется макрос for
для просмотра всех совпадений, но это также может быть сделано в привязке аргумента let
или функции):
user> (dorun
(for [[m1 m2 m3] (re-seq #"the (\w+(t))" "the cat sat on the mat")]
(do (println "m1:" m1)
(println "m2:" m2)
(println "m3:" m3))))
m1: the cat
m2: cat
m3: t
m1: the mat
m2: mat
m3: t
</code>