2010-02-15 6 views
14

J'essaie de comprendre comment remplacer une citation comme ' avec quelque chose comme \'.Remplacer «avec » dans Ruby?

Comment est-ce que je ferais ceci?

J'ai essayé

"'".gsub("'","\\'") 

mais il donne juste une chaîne vide. Qu'est-ce que je fais mal ici?

+0

J'ai modifié ma réponse – marcgg

+0

J'espère que vous n'essayez pas d'échapper à l'entrée SQL. Toujours «préparer» vos déclarations. –

+0

Non, il s'agit d'un code d'échappement, mais pas de SQL. – Earlz

Répondre

27

Que diriez-vous de cette

puts "'".gsub("'","\\\\'") 
\' 

La raison est que \' signifie après-match à gsub (regex) et de ce dont il a besoin être échappé avec \\' et \ est évidemment échappé comme \\, se terminant par \\\\'.

Exemple

>> "abcd".gsub("a","\\'") 
=> "bcdbcd" 

a est remplacé par tout ce qui suit a.

+0

Merci d'expliquer cela pour moi .. Je suppose que gsub a juste quelques "caractéristiques" cachées – Earlz

-1

Que diriez-vous faire:

"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'") 

pas assez mais je pense que cela fonctionne ...

+0

La version destructive ne fonctionne pas non plus. juste donne une chaîne vide de l'invite irb – Earlz

+0

Ok laissez-moi jeter un coup d'oeil – marcgg

+0

La version de Ruby est 'ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]' – Earlz

0

Ce pourrait être un bug .. Ou à tout le moins, ce qui brise mon idée du principe de la moindre surprise.

irb(main):039:0> "life's grand".gsub "'", "\\\'" 
=> "lifes grands grand" 
irb(main):040:0> "life's grand".gsub "'", "\\\\'" 
=> "life\\'s grand" 
+0

Oui, ceci est Ça n'a pas de sens pour moi .. bien sûr que je pourrais utiliser regex pour ça, mais cela semble être trop. – Earlz

2

La variable $' est la chaîne à droite du match. Dans la chaîne de remplacement gsub, la même variable serait \' - d'où le problème.

x = "'foo'" 
x.gsub!(/'/, "\\'") 
puts x.inspect  # foo'foo 

Cela devrait fonctionner:

x = "'foo'" 
x.gsub!(/'/, "\\\\'") 
puts x.inspect 
puts x 
0

Une approche en deux étapes, je suis en fait utilisé ...

BACKSLASH = 92.chr 
temp = "'".gsub("'", "¤'") 
puts temp.gsub("¤", BACKSLASH) 
=> "\'" 

ne fonctionnera que si « ¤ » est pas utilisé dans le texte évidemment ...