2010-02-15 13 views
14

Próbuję dowiedzieć się, jak zastąpić cytat taki jak ' z czymś takim jak \'.Zamień "na " w Ruby?

Jak to zrobić?

Próbowałem

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

ale to daje pusty ciąg. Co ja tu robię źle?

+0

edytowany moja odpowiedź – marcgg

+0

Mam nadzieję, że nie próbujesz uniknąć wejścia SQL. Zawsze "przygotuj" swoje oświadczenia. –

+0

Nie, to kod ucieczkowy, ale nie SQL. – Earlz

Odpowiedz

27

Jak o tym

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

Powodem jest to, że \' oznacza Pomeczowe w gsub (regex) i ze względu na to, że potrzebuje aby uciec z \\' i \ ewidentnie uciekł jako \\, kończąc na \\\\'.

Przykład

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

a otrzymuje się późniejszej a.

+0

Dziękuję za wyjaśnienie tego dla mnie .. Zgaduję, że gsub ma tylko ukryte "cechy" – Earlz

-1

Jak o zrobieniu tego:

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

Nie dość, ale myślę, że to działa ...

+0

Niszczycielska wersja również nie działa. po prostu zwraca pusty ciąg znaków z wiersza zachęty irb – Earlz

+0

Ok daj mi spojrzeć na to – marcgg

+0

Wersja Ruby to 'ruby 1.8.6 (2009-06-08 patchlevel 369) [x86_64-openbsd4.6]' – Earlz

0

To może być błąd .. Albo przynajmniej, coś, co łamie mi idea zasada najmniejszej niespodzianki.

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

Tak, to jest nie ma sensu dla mnie .. na pewno mógłbym użyć do tego celu regex, ale to wydaje się przesadą. – Earlz

2

Zmienna $' to ciąg po prawej stronie dopasowania. W łańcuchu zamiennym gsub ta sama zmienna byłaby \' - stąd problem.

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

To powinno działać:

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

podejście dwuetapowe mam faktycznie używane ...

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

będzie działać tylko wtedy „¤” nie jest używany w tekście oczywiście ...