2010-02-15 16 views
14

Sto cercando di capire come sostituire un preventivo come ' con qualcosa come \'.Sostituisci 'with ' in Ruby?

Come faccio?

Ho provato

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

ma dà solo una stringa vuota. Cosa sto facendo di sbagliato qui?

+0

Ho modificato la mia risposta – marcgg

+0

Spero che tu non stia cercando di evitare l'input SQL. Prepara sempre le tue dichiarazioni. –

+0

No, è un codice di escape, ma non SQL. – Earlz

risposta

27

ne dite di questo

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

La ragione è che \' significa post-partita in gsub (regex) e per questo ha bisogno essere sfuggito con \\' e \ è ovviamente sfuggito come \\, finendo con \\\\'.

Esempio

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

a è sostituito con tutto dopo a.

+0

Grazie per avermelo spiegato .. Immagino che gsub abbia solo alcune "caratteristiche" nascoste – Earlz

-1

ne dite di fare questo:

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

Non bella, ma penso che funziona ...

+0

Anche la versione distruttiva non funziona. restituisce una stringa vuota dal prompt irb – Earlz

+0

Ok fammi dare un'occhiata a questo – marcgg

+0

La versione ruby ​​è 'ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]' – Earlz

0

che potrebbe essere un bug .. O per lo meno, qualcosa che rompe la mia idea di principio di minima sorpresa.

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

Sì, questo è non ha senso per me ... certo che potrei usare regex per questo, ma sembra eccessivo. – Earlz

2

La variabile $' è la stringa alla destra della partita. Nella stringa di sostituzione gsub, la stessa variabile sarebbe \' - quindi il problema.

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

Questo dovrebbe funzionare:

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

Un approccio in due fasi realtà ho usato ...

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

funziona solo se '¤' non viene utilizzato nel testo, ovviamente ...