2012-08-16 30 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