Mark J. Reed said:
You're missing an extra level of processing applied to the replacement
string for gsub in order to let you include parts of what you're
replacing.
No, in this case he's missing extra backslashes:
irb(main):002:0> str='a\'o'
=> "a'o"
irb(main):003:0> str.gsub(/'/, '\\\\\'' )
=> "a\\'o"
irb(main):004:0> puts str.gsub(/'/, '\\\\\'' )
a\'o
=> nil
It does look a bit odd, but the explanation is logical: There are two
levels of escaping involved. The first level is that needed for the ruby
parser to get the expected characters into the replacement string. The
second level is used in order to be able to use a backslash literally in
the substitution string.
irb(main):005:0> puts '\\\\\''
\\'
=> nil
You need two backslashes in the substitution string to prevent gsub from
interpreting the backslash as escape char. That makes four backslashes
when entering the string. The fifth backslash escapes the single quote in
order to be able to include it into the string.
Regards
robert