clojure.string/replace behaves unexpectedly when \ or $ are part of the result string


  • Type: Defect Defect
  • Status: Closed Closed
  • Priority: Minor Minor
  • Resolution: Completed
  • Affects Version/s: Release 1.2, Release 1.3
  • Fix Version/s: Release 1.5
  • Component/s: None
  • Labels:
  • Environment:
    HW/OS/SW indipendant - issue is part of java interface
  • Patch:
    Code and Test
  • Approval:


clojure.string/replace uses javas replace function to do it's work, the replace function has the tricky habit of 'double evaluating' the replacement string (third argument). This means that every \ in the string (so i.e. "
") is evaluated by the java code behind replace.

Since this behavior isn't documented it can lead to confusing errors, for example (made up semi real world example to explain the issue):

(clojure.string/replace "c:/windows/" #"/" "\\")

This should replace all unix folder separators with windows separators, this crashes with a index out of bound exemption since java tries to evaluate "
" as a semi regexp.


(println (str "\"" (clojure.string/replace "my string with \\ and \" in it" #"[\"\\]" (fn [x] (str "\\" x))) "\""))

The expected result would be:

"my string with \\ and \" in it"

the actual result is:

"my string with \ and " in it"

This should return an 'escaped' string, it does not since the 'double evaluation' of the return string results in \\\\ being reduced to

  1. 0001-Add-tests-for-870.patch
    05/Jan/12 8:53 PM
    0.9 kB
    Alan Malloy
  2. 0002-Fix-870-by-using-quoteReplacement.patch
    05/Jan/12 8:53 PM
    1 kB
    Alan Malloy
  3. CLJ-753-870-905-combined-fix3.patch
    28/Feb/12 12:38 PM
    9 kB
    Andy Fingerhut
  4. CLJ-753-870-905-combined-fix3.readme.txt
    28/Feb/12 12:38 PM
    3 kB
    Andy Fingerhut
  5. clj-753-870-905-combined-fix4.patch
    15/Aug/12 11:19 AM
    9 kB
    Andy Fingerhut



Vote (2)
Watch (3)


  • Created: