1

clojure でバグを見つけたと思うのですが、バックスラッシュが出力にない理由を誰か説明できますか?

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

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

2 に答える 2

4

関数のドキュメントを確認してください: http://clojuredocs.org/clojure_core/clojure.string/replace

具体的には:

注: replace-first または replace が一致引数として正規表現パターンを持っている場合、置換文字列内のドル記号 ($) およびバックスラッシュ (\) 文字は特別に扱われます。

于 2012-08-16T04:19:59.660 に答える
3

これはバグではありません。3 番目のパラメーターの関数によって返される文字列は、次のようなことができるようにエスケープ シーケンスを解析します。

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

最初の $ がバックスラッシュでエスケープされているのに対し、2 番目の $ はキャプチャ グループの識別子として機能することに注意してください。4 つのバックスラッシュを使用するようにコードを変更すると、機能します。

(clojure.string/replace "The color? is red." #"[?.]"  #(str "zzz\\\\j" %1 %1))
于 2012-08-16T04:22:51.677 に答える