I want to escape a string such that all occurances of '&' become '\&'. I can't seem to do it with gsub. irb(main):014:0> '&'.gsub(/&/, "\&") "&" irb(main):015:0> '&'.gsub(/&/, "\\&") "&" irb(main):016:0> '&'.gsub(/&/, "\\\&") "&" irb(main):017:0> '&'.gsub(/&/, "\\\\&") "\\&" Have I stumbled upon a bug? It refuses to add a single backslash; always zero or two.