Bug #6474
closedSubstitution bug in String # gsub
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 12 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/6474Author: 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
--
Mike Stok mike@stok.ca
http://www.stok.ca/~mike/
The "`Stok' disclaimers" apply.
Updated by shyouhei (Shyouhei Urabe) over 12 years ago
- Status changed from Open to Closed
As Mike said backslashes are escaped in double-quoted strings.