2009-02-13 4 views
6

In Ruby, ich habe:In Ruby, wie ersetze ich das Fragezeichen in einer Zeichenfolge?

require 'uri' 
foo = "et tu, brutus?" 
bar = URI.encode(foo)  # => "et%20tu,%20brutus?" 

Ich versuche bar zu erhalten, gleich "et% 20tu,% 20brutus% 3f" (ersetzt durch "% 3F" "?") Wenn ich versuche hinzufügen dies:

bar["?"] = "%3f" 

die "?" alles passt, und ich bekomme

=> "%3f" 

ich

habe versucht
bar["\?"] 
bar['?'] 
bar["/[?]"] 
bar["/[\?]"] 

Und ein paar andere Dinge, von denen keine Arbeit.

Hinweise?

Danke!

+1

Aus Neugier, haben Sie versucht, bar ["\\?"] '? – Tim

Antwort

12

require 'cgi' und rufen CGI.escape

4

Hier ist eine Probe irb Sitzung:

irb(main):001:0> x = "geo?"

=> "geo?"

irb(main):002:0> x.sub!("?","a")

=> "geoa"

irb(main):003:0>

jedoch sub wird nur das erste Zeichen ersetzen. Wenn Sie alle Fragezeichen in einer Zeichenfolge ersetzen möchten, verwenden Sie die gsub Methode wie folgt:

str.gsub!("?","replacement")

+1

Danke. Dies und CGI.escape funktionieren beide gut. Ich ging mit diesem jedoch. (Weniger erfordert.) – Olie

+1

@geo, obwohl Ihre Antwort technisch korrekt ist und zu Olie's Punkt, sollte er wirklich CGI.escape verwenden. – vladr

+1

Ja, aber auf diese Weise steigt seine Kenntnis der Sprache. – Geo

3

Es gibt nur eine gute Möglichkeit, dieses Recht jetzt zu tun in Ruby:

require "addressable/uri" 
Addressable::URI.encode_component(
    "et tu, brutus?", 
    Addressable::URI::CharacterClasses::PATH 
) 
# => "et%20tu,%20brutus%3F" 

Aber wenn Sie mit URIs sind Sachen zu tun sollten Sie wirklich sowieso mit Addressable sein.

sudo gem install addressable 
0

Wenn Sie wissen, welche Zeichen Sie akzeptieren, können Sie diejenigen entfernen, die nicht übereinstimmen.

accepted_chars = 'A-z0-9\s,' 
foo = "et tu, brutus?" 
bar = foo.gsub(/[^#{accepted_chars}]/, '') 
Verwandte Themen