如何制作clojure.string / replace convert" a.b.c"到" a \ .b \ .c"?

时间:2016-08-12 01:24:28

标签: clojure

我正在努力通过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字符串中有一些关于字符转义的东西,我只是没有得到。

5 个答案:

答案 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