Project

General

Profile

Actions

Bug #6474

closed

Substitution bug in String # gsub

Added by hadmut (Hadmut Danisch) over 9 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
Backport:
[ruby-core:45152]

Description

Hi,

I need to replace all occurences of & with & in a String (generating LaTeX input).

However, gsub has a problem with unescaping the \ character in the replacement string:

irb(main):001:0> "a&b"
=> "a&b"
irb(main):002:0> "a&b".gsub('&','&')
=> "a&b"
irb(main):003:0> "a&b".gsub('&','\&')
=> "a&b"
irb(main):004:0> "a&b".gsub('&','\&')
=> "a\&b"
irb(main):005:0> "a&b".gsub('&','\\&')
=> "a\&b"

So it always inserts either zero or two \ characters, but never a single one. Not possible to generate "a&b"

regards

Updated by mikestok (Mike Stok) over 9 years ago

Maybe you are bing confused by the way irb displays results as double quoted strings. If you explicitly use puts:

ratdog:~ mike$ irb
1.9.3-p125 :001 > s = 'a&b'
=> "a&b"
1.9.3-p125 :002 > puts s.gsub '&', '&'
a&b
=> nil
1.9.3-p125 :003 > puts s.gsub '&', '\&'
a&b
=> nil
1.9.3-p125 :004 > puts s.gsub '&', '\&'
a&b
=> nil
1.9.3-p125 :005 > puts s.gsub '&', '\\&'
a&b
=> nil

I like using a block to make this situation less full of backslashes e.g.

1.9.3-p125 :006 > puts s.gsub('&') { '&' }
a&b

To see the way irb displays strings consider:

1.9.3-p125 :008 > s = 'a&b'
=> "a\&b"
1.9.3-p125 :009 > puts s
a&b
=> nil
1.9.3-p125 :010 > puts s.length
4
=> nil
1.9.3-p125 :011 > s = "a\tb"
=> "a\tb"
1.9.3-p125 :012 > puts s
a b
=> nil

Hope this helps,

Mike

On 2012-05-20, at 9:19 AM, hadmut (Hadmut Danisch) wrote:

Issue #6474 has been reported by hadmut (Hadmut Danisch).


Bug #6474: Substitution bug in String # gsub
https://bugs.ruby-lang.org/issues/6474

Author: hadmut (Hadmut Danisch)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]

Hi,

I need to replace all occurences of & with & in a String (generating LaTeX input).

However, gsub has a problem with unescaping the \ character in the replacement string:

irb(main):001:0> "a&b"
=> "a&b"
irb(main):002:0> "a&b".gsub('&','&')
=> "a&b"
irb(main):003:0> "a&b".gsub('&','\&')
=> "a&b"
irb(main):004:0> "a&b".gsub('&','\&')
=> "a\&b"
irb(main):005:0> "a&b".gsub('&','\\&')
=> "a\&b"

So it always inserts either zero or two \ characters, but never a single one. Not possible to generate "a&b"

regards

--
http://bugs.ruby-lang.org/

--

Mike Stok mike@stok.ca
http://www.stok.ca/~mike/

The "`Stok' disclaimers" apply.

Updated by shyouhei (Shyouhei Urabe) over 9 years ago

  • Status changed from Open to Closed

As Mike said backslashes are escaped in double-quoted strings.

Actions

Also available in: Atom PDF