Regex to escape special characters


#1

I’ve got the following string…

“This is ( a test”

And I want to do a regex gsub on it to turn it into…

“This is ( a test”

In irb, If I start with…

“This is ( a test”.gsub(/[(]/,’&’) => “This is ( a test”

And then progressively added more backslashes, I get the following
results, none of which are what I’m looking for. The second one is,
IMO, the one that should work.

“This is ( a test”.gsub(/[(]/,’\&’) => “This is ( a test”
“This is ( a test”.gsub(/[(]/,’\&’) => “This is \& a test”
“This is ( a test”.gsub(/[(]/,’\\&’) => “This is \& a test”
“This is ( a test”.gsub(/[(]/,’\\&’)=> “This is \( a test”

Am I just having a serious case of the mondays, or is there a bug in how
Ruby deals with \ characters when trying to represent an actual single
character?

I’m using ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

http://www.5valleys.com/

http://www.workingwithrails.com/person/8078


#2

Jon G. wrote:

I’ve got the following string…

“This is ( a test”

And I want to do a regex gsub on it to turn it into…

“This is ( a test”

In irb, If I start with…

“This is ( a test”.gsub(/[(]/,’&’) => “This is ( a test”

And then progressively added more backslashes, I get the following
results, none of which are what I’m looking for. The second one is,
IMO, the one that should work.

“This is ( a test”.gsub(/[(]/,’\&’) => “This is ( a test”
“This is ( a test”.gsub(/[(]/,’\&’) => “This is \& a test”
“This is ( a test”.gsub(/[(]/,’\\&’) => “This is \& a test”
“This is ( a test”.gsub(/[(]/,’\\&’)=> “This is \( a test”

Am I just having a serious case of the mondays, or is there a bug in how
Ruby deals with \ characters when trying to represent an actual single
character?

I’m using ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

irb shows you the result using p, which escapes special characters in
the string it displays. Use puts to see the actual string.

C:>irb
irb(main):001:0> x = “This is ( a test”
=> “This is ( a test”
irb(main):002:0> x.gsub(/(/, ‘\(’)
=> “This is \( a test”
irb(main):003:0> y = x.gsub(/(/, ‘\(’)
=> “This is \( a test”
irb(main):004:0> puts y
This is ( a test
=> nil
irb(main):005:0>


#3

Tim H. wrote:

In irb, If I start with…
“This is ( a test”.gsub(/[(]/,’\\&’)=> “This is \( a test”
the string it displays. Use puts to see the actual string.
=> nil
irb(main):005:0>

Oh, fer cryin’ out loud. Case of the mondays it is. Thanks.

http://www.5valleys.com/

http://www.workingwithrails.com/person/8078


#4

badboy wrote:

In irb, If I start with…
“This is ( a test”.gsub(/[(]/,’\\&’)=> “This is \( a test”

Yikes…thanks for the reminder. I always seem to find 6 hard ways to do
something before learning (and occasionally discovering) an easy way.
Regexp.escape solve LOTS of problems quickly. ~t.

Tom C., MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< removed_email_address@domain.invalid >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)

#5

Jon G. schrieb:

“This is ( a test”.gsub(/[(]/,’&’) => “This is ( a test”

Am I just having a serious case of the mondays, or is there a bug in how
Ruby deals with \ characters when trying to represent an actual single
character?

I’m using ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]

you know Regexp.escape ?