# Gsub and backslashes

**URL:** <https://www.ruby-forum.com/t/gsub-and-backslashes/82828>\
**Category:** Ruby\
**Created:** [January 21, 2007, 4:24pm UTC](https://www.ruby-forum.com/t/gsub-and-backslashes/82828 "2007-01-21T16:24:49Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![princenamor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/c0e974/32.png) [@princenamor](https://www.ruby-forum.com/u/princenamor)\
**Post date:** [January 21, 2007, 4:24pm UTC](https://www.ruby-forum.com/t/gsub-and-backslashes/82828/1 "2007-01-21T16:24:49Z")

</div>

Say I want to replace all occurrences of \ in a string with \:

test = “a string with \ a backslash”  
puts test.gsub(/\/, “\\”) #no worky  
=\> a string with \ a backslash

puts test.gsub(/\/, “\\\”) #why does this work?  
=\> a string with \ a backslash

Why does the replacement string have to be six backslashes? Hopefully  
this is really simple and I’m just being dense…

---

<div class="post-metadata">

**Author:** ![princenamor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/c0e974/32.png) [@princenamor](https://www.ruby-forum.com/u/princenamor)\
**Post date:** [January 21, 2007, 4:36pm UTC](https://www.ruby-forum.com/t/gsub-and-backslashes/82828/2 "2007-01-21T16:36:13Z")

</div>

John W. schrieb:

> this is really simple and I’m just being dense…

Ooops

irb(main):005:0\> puts “a string with \ a backslash”.gsub(/\/,  
“\\\\”)  
a string with \ a backslash

This works as expected, but why it works with ‘’\*6 I don’t understand.

Wolfgang NÃ¡dasi-Donner

---

<div class="post-metadata">

**Author:** ![princenamor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/c0e974/32.png) [@princenamor](https://www.ruby-forum.com/u/princenamor)\
**Post date:** [January 21, 2007, 4:46pm UTC](https://www.ruby-forum.com/t/gsub-and-backslashes/82828/3 "2007-01-21T16:46:14Z")

</div>

John W. wrote:

> Say I want to replace all occurrences of \ in a string with \:

This is a FAQ. Please search the mailing list archives and the web;  
there have been numerous discussions of it, articles written about it,  
and it’s addressed in the free online version of Programming Ruby.

Definitely come back with more questions if you really can’t find the  
answer online, though.

---

<div class="post-metadata">

**Author:** ![princenamor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/c0e974/32.png) [@princenamor](https://www.ruby-forum.com/u/princenamor)\
**Post date:** [January 21, 2007, 5:46pm UTC](https://www.ruby-forum.com/t/gsub-and-backslashes/82828/4 "2007-01-21T17:46:20Z")

</div>

Wolfgang NÃ¡dasi-Donner schrieb:

> Ooops
> 
> irb(main):005:0\> puts “a string with \ a backslash”.gsub(/\/, “\\\\”)  
> a string with \ a backslash
> 
> This works as expected, but why it works with ‘’\*6 I don’t understand.

Even after looking to “Programming Ruby - Second Edition”, and several  
other  
places, I have no idea why it works with ‘\\\’, and other strange  
things like  
this:

irb(main):001:0\> x = “a\b”  
=\> “a\b”  
irb(main):002:0\> puts x  
a\b  
=\> nil  
irb(main):003:0\> puts x.gsub(/\/, ‘+\\\+’)  
a+\b  
=\> nil  
irb(main):004:0\> puts x.gsub(/\/, ‘+\\\\+’)  
a+\+b  
=\> nil  
irb(main):005:0\> puts x.gsub(/\/, ‘+\\\t’)  
a+\tb  
=\> nil  
irb(main):006:0\> puts x.gsub(/\/, ‘+\\\\t’)  
a+\tb  
=\> nil

Especially if I take the following into account:

irb(main):001:0\> x = ‘\\’  
=\> “\\”  
irb(main):002:0\> puts x  
\  
=\> nil  
irb(main):003:0\> puts Regexp.escape(x)  
\\  
=\> nil  
irb(main):004:0\> Regexp.escape(x) == ‘\\\\’  
=\> true  
irb(main):005:0\> Regexp.escape(x) == ‘\\\’  
=\> false

Wolfgang NÃ¡dasi-Donner

---

<div class="post-metadata">

**Author:** ![princenamor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/c0e974/32.png) [@princenamor](https://www.ruby-forum.com/u/princenamor)\
**Post date:** [January 21, 2007, 9:06pm UTC](https://www.ruby-forum.com/t/gsub-and-backslashes/82828/5 "2007-01-21T21:06:51Z")

</div>

John W. wrote:

> this is really simple and I’m just being dense…  
> puts test.gsub(/\/, ‘&&’)
