在Ruby中,如何替换字符串中的问号字符?

时间:2009-02-13 18:29:36

标签: ruby string uri substitution

在Ruby中,我有:

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

我试图让bar等于“et%20tu,%20brutus%3f”(“?”替换为“%3F”)当我尝试添加此内容时:

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

“?”匹配一切,我得到

=> "%3f"

我试过

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

还有其他一些事情,其中​​没有一个可行。

提示?

谢谢!

4 个答案:

答案 0 :(得分:12)

require 'cgi'并致电CGI.escape

答案 1 :(得分:4)

以下是irb会话示例:

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

=> "geo?"

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

=> "geoa"

irb(main):003:0>

但是,sub只会替换第一个字符。如果要替换字符串中的所有问号,请使用 gsub 方法,如下所示:

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

答案 2 :(得分:4)

现在只有一种方法可以在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

答案 3 :(得分:0)

URI.escape 接受可选参数来告诉您要转义哪些字符。它会覆盖默认值,因此您必须调用它两次。

> URI.escape URI.escape("et tu, brutus?"), "?"
=> "et%20tu,%20brutus%3F"