用另一个字符替换Ruby中的char

时间:2014-08-01 16:10:39

标签: ruby string algorithm replace

我试图用'%20'替换字符串中的所有空格,但它没有产生我想要的结果。

我分裂字符串,然后浏览每个字符。如果角色是" "我想用'%20'替换它,但由于某种原因它没有被替换。我做错了什么?

def twenty(string)
  letters = string.split("")
  letters.each do |char|
    if char == " "
        char = '%20'
    end
  end

  letters.join
end

p twenty("Hello world is so played out")

2 个答案:

答案 0 :(得分:3)

使用URI.escape(...) for proper URI encoding

require 'uri'
URI.escape('a b c') # => "a%20b%20c"

或者,如果你想把自己作为一个有趣的学习练习,这是我的解决方案:

def uri_escape(str, encode=/\W/)
  str.gsub(encode) { |c| '%' + c.ord.to_s(16) }
end

uri_escape('a  b!c') # => "a%20%20b%21c"

最后,为了回答您的具体问题,您的代码段不会按预期运行,因为each迭代器不会改变目标;请尝试使用map with assignment(或map!):

def twenty(string)
  letters = string.split('')
  letters.map! { |c| (c == ' ') ? '%20' : c }
  letters.join
end

twenty('a b c') # => "a%20b%20c"

答案 1 :(得分:1)

如果你想首先在空格上拆分字符串,你可以这样做:

def twenty(string)
  string.split(' ').join('%20')
end

p twenty("Hello world is so played out")
  #=> "Hello%20world%20is%20so%20played%20out"

请注意,这与

不同
def twenty_with_gsub(string)
  string.gsub(' ', '%20')
end

for if

string = 'hi                there'

然后

twenty(string)
  #=> "hi%20there"
twenty_with_gsub(string)
  #=> "hi%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20there"