Details
-
Type:
Defect
-
Status:
Closed
-
Priority:
Minor
-
Resolution: Completed
-
Affects Version/s: Release 1.2, Release 1.3
-
Fix Version/s: Release 1.5
-
Component/s: None
-
Labels:None
-
Environment:HW/OS/SW indipendant - issue is part of java interface
-
Patch:Code and Test
-
Approval:Ok
Description
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.
or
(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
again.
Attachments
Activity
| Field | Original Value | New Value |
|---|---|---|
| Patch | Code and Test [ 10002 ] | |
| Approval | Vetted [ 10003 ] | |
| Affects Version/s | Release 1.3 [ 10038 ] | |
| Fix Version/s | Backlog [ 10035 ] |
| Attachment | 0002-Fix-870-by-using-quoteReplacement.patch [ 10761 ] | |
| Attachment | 0001-Add-tests-for-870.patch [ 10760 ] |
| Attachment | CLJ-870-also-fix-replace-first.patch [ 10762 ] |
| Attachment | CLJ-753-870-905-combined-fix.patch [ 10768 ] |
| Assignee | Stuart Sierra [ stuart.sierra ] |
| Attachment | CLJ-753-870-905-combined-fix2.patch [ 10801 ] |
| Patch | Code and Test [ 10002 ] |
| Patch | Code and Test [ 10002 ] |
| Patch | Code and Test [ 10002 ] |
| Attachment | CLJ-753-870-905-combined-fix3.readme.txt [ 10972 ] | |
| Attachment | CLJ-753-870-905-combined-fix3.patch [ 10971 ] |
| Attachment |
|
| Attachment |
|
| Attachment |
|
| Fix Version/s | Backlog [ 10035 ] | |
| Fix Version/s | Release 1.5 [ 10150 ] |
| Approval | Vetted [ 10003 ] | Incomplete [ 10006 ] |
| Attachment | clj-753-870-905-combined-fix4.patch [ 11434 ] |
| Approval | Incomplete [ 10006 ] | Vetted [ 10003 ] |
| Assignee | Stuart Sierra [ stuart.sierra ] | Fogus [ fogus ] |
| Assignee | Fogus [ fogus ] | Stuart Sierra [ stuart.sierra ] |
| Waiting On | richhickey | |
| Approval | Vetted [ 10003 ] | Screened [ 10004 ] |
| Approval | Screened [ 10004 ] | Ok [ 10007 ] |
| Resolution | Completed [ 1 ] | |
| Status | Open [ 1 ] | Closed [ 6 ] |
A working code for the replace example is:
which is horribly ugly since you need to hand escape the backslash or it crashes.