1

我正在尝试匹配字符串中某个位置 k(下例中的 k=3)的模式。

我试过了

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

但它不匹配任何东西 ( => nil)

Clojure 的方法是什么?(我在 Clojure 1.4.0 上)

一个很好的选择是在任何地方匹配模式,但是我需要它在输入中找到模式的位置。我可以在不访问java.util.regex.Matcher实例的情况下执行此操作吗?(我被告知这是非常糟糕的,因为它是可变的)

4

3 回答 3

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]
于 2013-01-31T19:11:05.247 回答
4

试试看(str (drop 3 "xxxalexandre"))返回什么:

=> (str (drop 3 "xxxalexandre"))
"clojure.lang.LazySeq@a65bc80b"

由于 drop 返回的是惰性序列,所以 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)))
"clojure.lang.LazySeq@a65bc80b"

用于apply实现lazy seq并将集合作为多个参数放入str函数中。

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

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

现在您的正则表达式将匹配:

=> (re-seq #"^alex" (apply str (drop 3 "xxxalexandre")))
("alex")
于 2013-01-31T19:26:54.567 回答
2

正则表达式中的 $ 映射到行尾.. 你可能想要 ^alex

于 2013-01-31T18:53:23.697 回答