在替换调用中获取正则表达式组的值
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"])
我有一个向量 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"])