2007/9/10, Ronald Fischer <ronald.fischer / venyon.com>:
> I thought this would be a trivial task, but it seems to be more
> difficult than expected:
>
> I have a variable, data, containing some string. I would like to
> preprend every
> single apostrophe in this string by a backslash. Here is my solution:
>
>    data.gsub!(/'/,%q(\\'))
>
> Strangely, this does not work. I tested it with data containing a string
> consisting
> of a single quote solely, and surrounded the code by "puts" like this:
>
> data=%q(')
> puts ":"+data+" replace quotes by "+%q(\\')
>         data.gsub!(/'/,%q(\\'))
> puts "data length now #{data.length}"
>
> This produced as output:
>
> :' replace quotes by \'
> data length now 0
>
> From this I conclude that the gsub! had shortened the string to length
> zero.
> Any explanation for this? How do I solve my problem in a proper way?

This comes up frequently.  You need to be aware that there are several
levels of interpretation involved and so you need multiple levels of
escaping.  This is sometimes obscured by the fact that '\1' works
although it should read '\\1'.  These levels are: 1. string escaping,
2. regexp replacement string escaping.  All these variants do work:

str.gsub /'/, '\\\\\\&'
str.gsub /'/, '\\\\\''
str.gsub /'/, "\\\\'"

Kind regards

robert