Clojure: получить список совпадений регулярных выражений - PullRequest
10 голосов
/ 19 октября 2010

Возможно, я все делаю неправильно, но я пытаюсь получить все совпадения в строке для определенного шаблона регулярных выражений. Я использую re-matcher для получения объекта Match, который я передаю re-find, давая мне (full-string-match, grouped-text) пары. Как получить последовательность всех совпадений, созданных объектом Match?

В Clojuresque Python это будет выглядеть так:

pairs = []
match = re-matcher(regex, line)

while True:
    pair = re-find(match)
    if not pair: break
    pairs.append(pair)

Есть предложения?

1 Ответ

23 голосов
/ 19 октября 2010

Вы, вероятно, хотите использовать встроенный 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...