2010-02-15 11 views
14

Ich versuche herauszufinden, wie man ein Zitat wie ' durch etwas wie \' ersetzen kann.Ersetzen "mit" in Ruby?

Wie würde ich das tun?

Ich habe

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

aber es gibt nur einen leeren String. Was mache ich hier falsch?

+0

ich meine Antwort bearbeitet – marcgg

+0

Ich hoffe, Sie versuchen nicht, SQL-Eingabe zu entkommen. Bereite deine Aussagen immer vor. –

+0

Nein, es ist Code entkommen, aber nicht SQL. – Earlz

Antwort

27

Wie über dieses

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

Der Grund dafür ist, dass \' bedeutet nach dem Spiel in gsub (Regex) und wegen, die sie braucht mit \\' und \ zu entkommen ist offensichtlich als \\ mit der Endungentkommen.

Beispiel

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

a nach a mit allem, was ersetzt.

+0

Danke für die Erklärung, dass für mich .. Ich denke, gsub hat nur einige versteckte "Features" – Earlz

-1

Wie wäre es, dies zu tun:

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

Nicht schön, aber ich denke, es funktioniert ...

+0

Die destruktive Version funktioniert auch nicht. gibt nur eine leere Zeichenfolge von der IRB-Eingabeaufforderung zurück – Earlz

+0

Ok lass mich einen Blick darauf werfen – marcgg

+0

Ruby-Version ist 'Ruby 1.8.6 (2009-06-08 Patchlevel 369) [x86_64-openbsd4.6]' – Earlz

0

, dass ein Fehler sein könnte .. Oder zumindest, was meine Vorstellung von der bricht Prinzip der geringsten Überraschung.

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

Ja, das ist macht keinen Sinn für mich .. sicher, ich könnte Regex dafür verwenden, aber das scheint wie Overkill. – Earlz

2

Die $' Variable ist die Zeichenfolge rechts des Spiels. In der Ersetzungszeichenfolge gsub wäre die gleiche Variable \' - daher das Problem.

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

Dies sollte funktionieren:

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

Ein zweistufiger Ansatz, den ich tatsächlich benutzt habe ...

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

funktioniert nur, wenn ‚¤‘ nicht offensichtlich im Text verwendet wird ...

Verwandte Themen