我正在尝试匹配字符串中某个位置 k(下例中的 k=3)的模式。
我试过了
(re-seq #"^alex" (str (drop 3 "xxxalexandre")))
但它不匹配任何东西 ( => nil)
Clojure 的方法是什么?(我在 Clojure 1.4.0 上)
一个很好的选择是在任何地方匹配模式,但是我需要它在输入中找到模式的位置。我可以在不访问java.util.regex.Matcher实例的情况下执行此操作吗?(我被告知这是非常糟糕的,因为它是可变的)
表达式(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]
试试看(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")
正则表达式中的 $ 映射到行尾.. 你可能想要 ^alex