2013-01-31 41 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