Clojure字符串替换奇怪的行为

Clojure字符串替换奇怪的行为,clojure,Clojure,我想我在clojure中发现了一个bug,有人能解释为什么输出中缺少反斜杠吗 (clojure.string/replace "The color? is red." #"[?.]" #(str "zzz\\j" %1 %1)) => "The colorzzzj?? is redzzzj.." 请查看以下位置的功能文档: 具体而言: 注意:当replacefirst或replace时,将正则表达式模式作为它们的 匹配中的参数、美元符号($)和反斜杠(\)字符 替换字符串经过特殊处理

我想我在clojure中发现了一个bug,有人能解释为什么输出中缺少反斜杠吗

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

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

请查看以下位置的功能文档:

具体而言:

注意:当replacefirst或replace时,将正则表达式模式作为它们的 匹配中的参数、美元符号($)和反斜杠(\)字符 替换字符串经过特殊处理


请查看以下位置的功能文档:

具体而言:

注意:当replacefirst或replace时,将正则表达式模式作为它们的 匹配中的参数、美元符号($)和反斜杠(\)字符 替换字符串经过特殊处理


这不是一个错误。第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))

这不是一个错误。第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))

马特球-事实上,它只会导致一个反斜杠,但我可以理解为什么你会感到困惑。在REPL中运行命令时,它将结果打印为字符串文字,在这种情况下,它必须将单个反斜杠显示为转义,因为它位于字符串文字内部。试着用一个
println
调用来包装整个过程,你会发现结果实际上是一个反斜杠。马特·鲍尔-啊,对不起,我没有看你发布的代码。但同样的原则也适用。
pr
函数以读取器可以解析的方式打印数据,而
print
以人类可读的格式输出数据。由于在本例中数据是字符串,
pr
打印字符串文字(注意周围的引号),而
print
只将原始字符串输出到控制台。将您的
pr
更改为
print
,您将获得预期的输出。马特·鲍尔-实际上,它只会产生一个反斜杠,但我可以理解为什么您会感到困惑。在REPL中运行命令时,它将结果打印为字符串文字,在这种情况下,它必须将单个反斜杠显示为转义,因为它位于字符串文字内部。试着用一个
println
调用来包装整个过程,你会发现结果实际上是一个反斜杠。马特·鲍尔-啊,对不起,我没有看你发布的代码。但同样的原则也适用。
pr
函数以读取器可以解析的方式打印数据,而
print
以人类可读的格式输出数据。由于在本例中数据是字符串,
pr
打印字符串文字(注意周围的引号),而
print
只将原始字符串输出到控制台。将您的
pr
更改为
print
,您将获得预期的输出。