2012-08-16 59 views
1

我想我发现了一个clojure中的错误,任何人都可以解释为什么输出中缺少反斜杠?Clojure字符串替换奇怪的行为

(clojure.string/replace "The color? is red." #"[?.]" #(str "zzz\\j" %1 %1)) 

=> "The colorzzzj?? is redzzzj.." 

回答

3

这不是一个错误。通过在第三个参数的函数返回的字符串被解析为转义序列,这样就可以做这样的事情:

(clojure.string/replace "The color? is red." #"([?.])" "\\$1$1") 
; => "The color$1? is red$1." 

注意如何第一个$由反斜线,而第二个作为标识符一个捕获组。改变你的代码,使用四个反斜杠和它的作品:

(clojure.string/replace "The color? is red." #"[?.]" #(str "zzz\\\\j" %1 %1)) 
+0

4反斜杠结束了在输出打印二:http://ideone.com/8myhP – 2012-08-16 04:25:17

+1

马特球 - 事实上,它只会导致一个backslash-但我明白你为什么会感到困惑。当您在REPL中运行命令时,它会将结果打印为字符串文字,在这种情况下,必须将单个反斜杠显示为已转义,因为它位于字符串文字中。尝试在'println'调用中包装整个事物,你会发现结果真的有一个反斜杠。 – DaoWen 2012-08-16 05:05:33

+1

Matt Ball - 啊,对不起,我没有看到你发布的代码。同样的原则适用于此。 'pr'函数以读者可以解析的方式打印数据,而'print'以可读格式输出数据。由于在这种情况下数据是一个字符串,因此'pr'会打印一个字符串文字(注意周围的引号),而'print'只是将原始字符串输出到控制台。把你的'pr'改成'print',你会得到预期的输出。 – DaoWen 2012-08-16 05:10:46