2009-02-13 98 views
6

在Ruby中,我有:在Ruby中,如何替換字符串中的問號字符?

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

我試圖讓巴等於 「等%20tu,%20brutus%3F」(用 「%3F」 替換爲 「?」),當我嘗試添加這個:

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

「?」匹配的一切,我得到

=> "%3f" 

我已經試過

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

和一些其他的東西,沒有一個工作。

提示?

謝謝!

+1

出於好奇,你試過`bar [「\\?」]`? – Tim 2012-01-17 19:54:23

回答

12

require 'cgi'並調用CGI.escape

4

下面是一個示例IRB會話:

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

=> "geo?"

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

=> "geoa"

irb(main):003:0>

然而,子只會替換第一個字符。如果要替換字符串中的所有問號,使用GSUB方法是這樣的:

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

+1

謝謝。這和CGI.escape都很好地工作。儘管如此,我還是選擇了這個。 (更少要求。) – Olie 2009-02-13 18:54:33

3

只有一個,現在要做到這一點正確的好方法在Ruby中:

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

但是如果你做的東西與你的URI應該真正使用Addressable反正。

sudo gem install addressable 
0

如果您知道接受哪些字符,則可以刪除那些不匹配的字符。

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