如何用Ruby中的哈希集合值替换字符串?

时间:2012-04-09 22:28:49

标签: ruby

我有一个哈希集合: my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}

我会使用什么语法来替换字符串中第一次出现的key哈希集合value

例如我的输入字符串: str = I want a 3

结果字符串将是: str = I want a cat

8 个答案:

答案 0 :(得分:19)

我的一个班轮:

hash.each { |k, v| str[k] &&= v }

或使用String#sub!方法:

hash.each { |k, v| str.sub!(k, v) }

答案 1 :(得分:13)

"I want a %{b}" % {c: "apple", b: "bee", a: "cat"}
=> "I want a bee"

答案 2 :(得分:4)

假设Ruby 1.9或更高版本:

str.gsub /\d/, my_hash

答案 3 :(得分:3)

我不明白你的问题,但你可以试试这个:

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
str = "I want a 3"
str.gsub(/[[:word:]]+/).each do |word|
  my_hash[word] || word
end
#=> "I want a cat"

:d

答案 4 :(得分:3)

只是将点免费样式滥用添加到fl00r的答案:

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
my_hash.default_proc = Proc.new {|hash, key| key}
str = "I want a 3"
str.gsub(/[[:word:]]+/).each(&my_hash.method(:[]))

答案 5 :(得分:2)

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}
str = "I want a 3"

如果您想要替换的字符串没有任何一般模式,您可以使用:

str.sub /#{my_hash.keys.map { |s| Regexp.escape s }.join '|'}/, my_hash

但是如果有的话,代码变得更加简单,例如:

str.sub /[0-9]+/, my_hash

如果要替换所有出现的事件,而不仅仅是第一次出现,请使用gsub。

答案 6 :(得分:0)

您可以在ruby 1.9中使用String.sub

string.sub(key, hash[key])

答案 7 :(得分:0)

以下代码将第一次出现的key替换为给定字符串value中的哈希集合str

 str.gsub(/\w+/) { |m| my_hash.fetch(m,m)}
    => "I want a cat"