В Ruby, как заменить знак вопроса в строке? - PullRequest
6 голосов
/ 13 февраля 2009

В Ruby у меня есть:

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

Я пытаюсь получить бар равным "et% 20tu,% 20brutus% 3f" ("?" Заменен на "% 3F"). Когда я пытаюсь добавить это:

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

"?" соответствует всему, и я получаю

=> "%3f"

Я пытался

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

И несколько других вещей, ни одна из которых не работает.

Подсказка

Спасибо!

Ответы [ 4 ]

12 голосов
/ 13 февраля 2009

require 'cgi' и звоните CGI.escape

4 голосов
/ 24 мая 2009

Есть только один хороший способ сделать это прямо сейчас в 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
4 голосов
/ 13 февраля 2009

Вот пример сеанса irb:

irb(main):001:0> x = "geo?"</p> <p>=> "geo?"</p> <p>irb(main):002:0> x.sub!("?","a")</p> <p>=> "geoa"</p> <p>irb(main):003:0> </p> <p>

Однако sub заменит только первый символ. Если вы хотите заменить все знаки вопроса в строке, используйте метод gsub следующим образом:

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

0 голосов
/ 28 ноября 2017

Если вы знаете, какие символы вы принимаете, вы можете удалить те, которые не соответствуют.

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