I want to replace all occurrences of a single quote ('
) with backslash single quote (\'
). I tried doing this with gsub
, but I'm getting partial string duplication:
a = "abc 'def' ghi"
a.gsub("'", "\\'")
# => "abc def' ghidef ghi ghi"
Can someone explain why this happens and what a solution to this is?
It happens because "\\'"
has a special meaning when it occurs as the replacement argument of gsub
, namely it means the post-match substring.
To do what you want, you can use a block:
a.gsub("'"){"\\'"}
# => "abc \\'def\\' ghi"
Notice that the backslash is escaped in the string inspection, so it appears as \\
.
Your "\\'"
actually represents a literal \'
because of the backslash escaping the next backslash. And that literal \'
in Ruby regex is actually a special variable that interpolates to the part of the string that follows the matched portion. So here's what's happening.
abc 'def' ghi
^
The caret points to the first match, '
. Replace it with everything to its right, i.e. def' ghi
.
abc def' ghidef' ghi
++++++++
Now find the next match:
abc def' ghidef' ghi
^
Once again, replace the '
with everything to its right, i.e. ghi
.
abc def' ghidef ghi ghi
++++
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With