2010-10-18 16 views
9

Być może wszystko robię źle, ale staram się uzyskać wszystkie dopasowania w ciągu znaków dla określonego wzorca regex. Używam re-matcher, aby uzyskać obiekt dopasowania, który przechodzę do re-find, dając mi pary (full-string-match, grouped-text). W jaki sposób uzyskać sekwencję wszystkich dopasowań tworzonych przez obiekt dopasowania?Clojure: uzyskaj listę dopasowań regex

W Clojuresque Pythonie, to będzie wyglądać:

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

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

jakieś sugestie?

Odpowiedz

21

Najprawdopodobniej chcesz użyć wbudowanej wersji re-seq i wbudowanej funkcji Clojure w regex. Nie zadzieraj z bazowymi obiektami java, chyba że naprawdę masz.

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

For example:

user> (re-seq #"the \w+" "the cat sat on the mat") 
("the cat" "the mat") 

In answer to the follow-up comment, group captures will result in a vector of strings with an element for each part of the group in a match:

user> (re-seq #"the (\w+(t))" "the cat sat on the mat") 
(["the cat" "cat" "t"] ["the mat" "mat" "t"]) 

You can extract a specific element by taking advantage of the elegant fact that vectors are functions of their indices.

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

Or you can destructure the matches (here using a for makro iść we wszystkich meczach, ale to może być również wykonane w argumencie let lub funkcję wiązania):

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 
+0

To właśnie szukam, ale jestem coraz inny wynik: wektor list, a nie wektor łańcuchów. – exupero

+0

Czy miałeś na myśli "sekwencję wektorów"? To jest to, co zostanie zwrócone, jeśli przechwycisz grupę w swoim regex. Dodałem jeszcze kilka przykładów powyżej. –

+0

Masz rację: musiałem mieć na myśli "sekwencję wektorów". Twoje przykłady wyjaśniły mi sprawę. Dzięki. – exupero

Powiązane problemy