我正在努力通过clojure.string / replace让字符序列a.b.c
成为a\.b\.c
。
鉴于......
(clojure.string/replace "a.b.c" #"\." "|")
=> "a|b|c"
为什么以下内容无法生成a\.b\.c
?
(clojure.string/replace "a.b.c" #"\." "\\.")
=> "a.b.c"
我可以获得正在寻找的效果,字符串中的所有.
都会被转义.
替换为\.
...
(clojure.string/replace "a.b.c" #"\." {"." "\\."})
=> "a\\.b\\.c"
...但是,yuk。在Clojure字符串中有一些关于字符转义的东西,我只是没有得到。
答案 0 :(得分:1)
如果您的目标是将"."
的所有实例替换为"\\."
,则可以执行以下操作:
(require '[clojure.string :as str])
(str/replace "a.b.c" "." "\\.")
;;=> "a\\.b\\.c"
答案 1 :(得分:1)
它与replaceAll
在引擎盖下被调用有关,这需要双重转义。查看this answer了解更多详情。要修复原文,请使用Sam Estep's reply并使用字符串,或使用正则表达式和字符串继续原始尝试:
(clojure.string/replace "a.b.c" #"\." "\\\\.")
=> "a\\.b\\.c"
答案 2 :(得分:0)
请注意,当它位于由双引号表示的字符串文字内时,您只需要转义反斜杠\
,例如" \\"对于1-char字符串> (def bs \\)
> bs
\\
> (println bs)
\
> (prn bs)
\\
> (str bs)
"\\"
。
Clojure允许您拥有有时更容易处理的单个字符文字。
str
请注意,当它在字符串中时(使用prn
),或准备被解释为字符串(使用println
),clojure会打印出转义版本。但是,对于bs
,它会打印未转义的版本。
如果我们从\.
和点> (def str-dot (str \.))
> (def str-bs-dot (str \\ \.))
> str-dot
"."
> str-bs-dot
"\\."
> (println str-dot)
.
> (println str-bs-dot)
\.
> (println (str/replace "a.b.c" str-dot str-bs-dot))
a\.b\.c
{{1}}
答案 3 :(得分:0)
此外,还有一种特殊的正则表达式替换语法:您可以使用$n
语法替换匹配的数据(其中n是regexp匹配的组的索引):
user> (clojure.string/replace "asd.sdf.dfg" #"\." "\\\\$0")
"asd\\.sdf\\.dfg"
在这个简单的案例中,它真的像是@Sam Estep的答案,但是当你想要在一遍中替换不同的字符时它会变得很方便:
user> (clojure.string/replace "a[s|d.sd]f.d|fg" #"[\.\|\[\]]" "\\\\$0")
"a\\[s\\|d\\.sd\\]f\\.d\\|fg"
或者例如(相当合成的)你想要在它之前用一些指示符来转义char:
user> (clojure.string/replace "asd <esc>. ... <esc>| <esc>["
#"<esc>(.)" "\\\\$1")
"asd \\. ... \\| \\["
答案 4 :(得分:0)
只是repl输出不同,实际上它正在大喊大叫正确的结果。
mit-scheme