2013-01-31 42 views
0

我試圖在一個字符串中的某個位置k(在下面的例子中k = 3)匹配模式Clojure正則表達式匹配

我已經試過

(re-seq #"^alex" (str (drop 3 "xxxalexandre"))) 

,但它不匹配任何東西(=> nil

什麼是Clojure的-辦法做到這一點? (我在Clojure 1.4.0上)

一個很好的選擇是將模式匹配到任何地方,但是我需要位置它在輸入中找到模式。我可以在不訪問java.util.regex.Matcher實例的情況下執行此操作嗎? (這是我一直在說是非常糟糕的,因爲它是可變的)

回答

5

表達(str (drop 3 ...(apply str (drop 3 ...

但是,更好的辦法是使用subs

user=> (re-seq #"^alex" (subs "xxxalexandre" 3)) 
("alex") 

或者,如果你喜歡,走在三個人物在你的正則表達式:

user=> (map second (re-seq #"^...(alex)" "xxxalexandre")) 
("alex") 

爲您跟進,尋找匹配的位置,單向(對於簡單情況)將使用.indexOf的結果:

user=> ((fn [s p] (let [[m] (re-seq p s)] [m (.indexOf s m)])) "xxxalexandre" #"alex") 
["alex" 3] 
+0

謝謝!有關替代方法的任何想法(請參閱我編輯的問題)? – Blacksad

+0

@Blacksad請參閱編輯您的後續問題。 –

2

$在正則表達式映射到行的末尾..你可能想^亞歷克斯

+0

Oups你說得對!編輯的問題,它仍然返回零。感謝收穫。 – Blacksad

4

嘗試看看(str (drop 3 "xxxalexandre"))回報:

=> (str (drop 3 "xxxalexandre")) 
"[email protected]" 

由於降返回一個懶序列,STR的參數是一個懶惰的順序,什麼是返回是懶惰序列的ToString,即一個對象引用的字符串。

=> (drop 3 "xxxalexandre") 
(\a \l \e \x \a \n \d \r \e) 

=> (str (lazy-seq `(\a \l \e \x \a \n \d \r \e))) 
"[email protected]" 

使用apply實現懶序列,並把收集到的STR功能爲多個參數。

=> (apply str (lazy-seq '(\a \l \e \x \a \n \d \r \e))) 
"alexandre" 

=> (apply str (drop 3 "xxxalexandre")) 
"alexandre" 

現在您正則表達式匹配WIL:

=> (re-seq #"^alex" (apply str (drop 3 "xxxalexandre"))) 
("alex") 
+0

感謝NielsK的很好的解釋。 – Blacksad