Problem with String.gsub and \' as a replacement string

R

ridcully

Hi,

I want to replace all occurences of a certain character in a string
with a backslash followed by a single quote. Sounds like a trivial
task, but this is what I get:

"this is a test".gsub( "a", "\\'" ) -> "this is test test"

What I want is "this is \' test".

Neither does this work:
"this is a test".gsub( "a", '\' + "'" )

No matter what I am doing, as soon as a backslash is followed by a
single quote in the replacement string, I am getting weird results.

Thanks for your help!

Andreas
 
A

Alex Young

ridcully said:
Hi,

I want to replace all occurences of a certain character in a string
with a backslash followed by a single quote. Sounds like a trivial
task, but this is what I get:

"this is a test".gsub( "a", "\\'" ) -> "this is test test"

What I want is "this is \' test".

Neither does this work:
"this is a test".gsub( "a", '\' + "'" )

No matter what I am doing, as soon as a backslash is followed by a
single quote in the replacement string, I am getting weird results.
Backslashes are confusing. Try this:

puts "this is a test".gsub( "a", "\\\\'" )
 
R

ridcully

Backslashes are confusing. Try this:

puts "this is a test".gsub( "a", "\\\\'" )

Thank you, you saved my day!

This really is confusing, because "\\'" gives me the correct result if
I don't use it with gsub:

puts "\\'" -> \'

Am I missing something here?

Andreas
 
S

Sebastian Hungerecker

ridcully said:
Thank you, you saved my day!

This really is confusing, because "\\'" gives me the correct result if
I don't use it with gsub:

puts "\\'" -> \'

Am I missing something here?

"\\'" translates to a literal backslash followed by '. This is what gsub gets.
gsub then sees \' and replaces it with $' the same way it would replace \1
with $1. To tell it not to do that it has to get \\', so it knows it's not
supposed to treat \' as special. In order to archieve that you have to
write "\\\\'". Hope that cleared things up for you.
 
B

botp

"this is a test".gsub( "a", "\\'" ) -> "this is test test"

many ways, eg

~> "this is a test".gsub("i",Regexp.escape("\\'"))
=> "th\\'s \\'s a test"

~> "this is a test".gsub("i"){"\\'"}
=> "th\\'s \\'s a test"

the block form seems clean though.

kind regards -botp
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,270
Messages
2,571,353
Members
48,038
Latest member
HunterDela

Latest Threads

Top