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?
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?
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
.
Grazie per avermelo spiegato .. Immagino che gsub abbia solo alcune "caratteristiche" nascoste – Earlz
ne dite di fare questo:
"'".gsub("\\","\\\\\\\\").gsub("'","\\\\'")
Non bella, ma penso che funziona ...
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"
Sì, questo è non ha senso per me ... certo che potrei usare regex per questo, ma sembra eccessivo. – Earlz
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
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 ...
Ho modificato la mia risposta – marcgg
Spero che tu non stia cercando di evitare l'input SQL. Prepara sempre le tue dichiarazioni. –
No, è un codice di escape, ma non SQL. – Earlz