在替换调用中获取正则表达式组的值

Getting the value of a regex group in a replace call

我有一个向量 s 和字符串 x:

(def s [5 6 7])
(def x "echo %1 %2 %3")

我想将 x 中的 %n 转换为值 s[n-1] 以生成:

echo 5 6 7

我该怎么做?到目前为止我得到的最远的是:

(clojure.string/replace code #"%(\d)" (s ""-1))

但这显然行不通。

clojure.string/replace 函数的替换参数可以是字符串,也可以是接受模式匹配和 returns 字符串的函数。在这种情况下,它应该是一个函数,如下所示。

user> (def s [5 6 7])
#'user/s

user> (def x "echo %1 %2 %3")
#'user/x

user> (defn replacement [match] (-> match second Long/parseLong dec s str))
#'user/replacement

user> (clojure.string/replace x #"%(\d)" replacement)
"echo 5 6 7"

replacement 函数采用两个字符串的向量,因为每个匹配项都作为字符串向量给出。

user> (re-seq #"%(\d)" "echo %1 %2 %3")
(["%1" "1"] ["%2" "2"] ["%3" "3"])