# Weird gsub behaviour

**URL:** <https://www.ruby-forum.com/t/weird-gsub-behaviour/183739>\
**Category:** Rails\
**Created:** [February 19, 2010, 9:49am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739 "2010-02-19T09:49:45Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 9:49am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/1 "2010-02-19T09:49:45Z")

</div>

ruby 1.8.6 (2007-09-24 patchlevel 111)

str = ‘&123’  
puts “abc”.gsub(“b”, str)  
puts “abc”.gsub(“b”, “#{str}”)  
puts “abc”.gsub(“b”, str.to\_s)  
puts “abc”.gsub(“b”, ‘&123’)  
puts “abc”.gsub(“b”, “&123”)

> ruby test.rb  
> ab123c  
> ab123c  
> ab123c  
> ab123c  
> a&123c \<------------------- This I want to achieve using temporary  
> variable  
> Exit code: 0

If I change  
str = ‘&123’  
to  
str = “&123”  
it works fine, but I get str from “match” function, so I cannot  
specify it manually within parantheses… Is there any way to change  
string’s ‘string’ to “string” behaviour???

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 11:31am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/2 "2010-02-19T11:31:01Z")

</div>

The exact problem

a = ‘aaa:bbb/’  
b = ‘\<a class=“add\_line” href="#" id=“add\_fields\_invoice\_lines”  
onclick="add\_fields(this, “invoice\_lines”, “\<fieldset class=  
&quot;inputs invoice\_line&quot;\>\<ol\>\n \<li class=  
&quot;string required invoice\_line\_name&quot; id=&quot;”’

str = (b.match /.\*/)[0]

puts str

pn=“bbb”

puts a.gsub(“aaa:#{pn}\/”, str)

=\> \<a class=“add\_line” href="#"  
id=“add\_fields\_invoice\_lines” onclick="add\_fields(this,  
“invoice\_lines”, "\<fieldset class=aaa:bbb/quot;inputs  
invoice\_lineaaa:bbb/quot;\>\<ol\>\n \<li class=\<aaa:bbb/

> quot;string required invoice\_line\_nameaaa:bbb/quot; id=\<aaa:bbb/  
> quot;"

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 11:31am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/3 "2010-02-19T11:31:36Z")

</div>

On Feb 19, 8:47 am, stevo84 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ruby 1.8.6 (2007-09-24 patchlevel 111)
> 
> str = ‘&123’  
> puts “abc”.gsub(“b”, str)  
> puts “abc”.gsub(“b”, “#{str}”)  
> puts “abc”.gsub(“b”, str.to\_s)  
> puts “abc”.gsub(“b”, ‘&123’)  
> puts “abc”.gsub(“b”, “&123”)

Why are you escaping the & at all ?

str = ‘&123’  
puts “abc”.gsub(“b”, str)

outputs a&123c for me

Fred

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 11:47am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/4 "2010-02-19T11:47:25Z")

</div>

It was received from already escaped html mixed with javascript - that  
is why ☹  
I have no influence on the fact that these slashes are there…

Anyway I have came up with a solution - maybe there is a simpler way,  
however the code below works

```
str = '\&123'

puts "abc".gsub("b", str.gsub(/\&/o, '\\\&\2\1'))

=> a\&123c
```

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 11:31am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/5 "2010-02-19T11:31:01Z")

</div>

Not sure I understand. From

a&123c \<------------------- This I want to achieve using temporary

I ask, do you know that & does not need escaping?

“abc”.gsub(“b”, “&123”) # =\> “a&123c”

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 11:49am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/6 "2010-02-19T11:49:11Z")

</div>

Argh - slashes missing → here is the pastie code →   
[http://pastie.org/832493](http://pastie.org/832493)

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 11:56am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/7 "2010-02-19T11:56:47Z")

</div>

On Fri, Feb 19, 2010 at 11:48 AM, stevo84 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Argh - slashes missing → here is the pastie code → [http://pastie.org/832493](http://pastie.org/832493)

Easier:

```
"abc".gsub("b") { |_| str }

```

There str is taken verbatim.

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 19, 2010, 4:09pm UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/8 "2010-02-19T16:09:43Z")

</div>

On Feb 19, 2010, at 5:14 AM, stevo84 wrote:

> puts str
> 
> pn=“bbb”
> 
> puts a.gsub(“aaa:#{pn}\/”, str)

So did you try:  
a.gsub(“aaa:#{pn}\/”) { b }

-Rob

> > ab123c  
> > str = “&123”  
> > .  
> > For more options, visit this group at [http://groups.google.com/group/rubyonrails-talk?hl=en](http://groups.google.com/group/rubyonrails-talk?hl=en)  
> > .

Rob B. [http://agileconsultingllc.com](http://agileconsultingllc.com)  
removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![stevo84](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f14d63/32.png) [@stevo84](https://www.ruby-forum.com/u/stevo84)\
**Post date:** [February 20, 2010, 8:48am UTC](https://www.ruby-forum.com/t/weird-gsub-behaviour/183739/9 "2010-02-20T08:48:20Z")

</div>

No, I did not… and it sure works! I knew that it should be easier 🙂

Thank You for another piece of knowledge, Rob and Xavier
