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

14

我有一个散列收集:

my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}

如果我想要用散列收集中的值替换字符串中第一次出现的键,应该使用什么语法?

例如,我的输入字符串是:

str = I want a 3

结果字符串将是:

str = I want a cat

2
输入字符串有什么假设?一般来说,像这样的模板语言会以某种方式标记它,比如 str = I want a {3}(.NET 字符串格式化)。 - Matthew Flaschen
2
Stack Overflow不是“请帮我写代码”的地方;你目前的代码进展如何?你有什么问题? - Phrogz
显然我错了。正如下面所证明的那样,我们都非常渴望帮助新用户,以至于我们会向他们提供代码。欢迎来到Stack Overflow!;) - Phrogz
1
如果可能的话,我会使用 Ruby 2.0 内置的字符串模板功能。给定一个带有符号键的哈希表,h = {pet: "cat"},你可以这样做:"I want a %{pet}" % h #=> "I want a cat" - Mark Thomas
8个回答

20

我的一行代码:

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

或者使用String#sub!方法:

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

3
在我获得选票时,支持使用String#[]=&&= - Phrogz
有人可以解释一下第一个一行代码是干什么的吗? - San
由于 Ruby 中的布尔运算符是短路的,只有在第一个参数为真时才会评估第二个参数。如果 String#[] 给定字符串,则查找并返回其子字符串引用。因此,如果我们将某些内容分配给它,我们将更改字符串的给定部分。最后,我们将它们连接在一起,如果在字符串中找到子字符串,则用哈希值替换它。 - Hauleth
1
Lukasz,干得好。一个更正:为了使你的第二个示例起作用,你需要使用'sub!'方法而不是'sub'方法。 'sub!'会直接更改字符串。(或者使用'gsub!'来替换字符串中所有匹配项。) - djoll

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

4
假设在 Ruby 1.9 或更高版本下:
str.gsub /\d/, my_hash

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


在我看来,它有点过载了。 - Hauleth
呵呵,我喜欢这个可以让我的头倒过来的程序。(我会点赞的,但是今天我要下班了 ;)) - Phrogz

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(:[]))

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。


0

在 Ruby 1.9 中,您可以使用 String.sub

string.sub(key, hash[key])

@Oleksi 你的意思是 hash 而不是 hash[key]my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"} my_str = 'I want a 3' puts my_str.sub('3', my_hash) # => 'I want a cat' - Matthew Hannigan

0
以下代码将使用哈希集合中的value替换给定字符串str中第一次出现的key
 str.gsub(/\w+/) { |m| my_hash.fetch(m,m)}
    => "I want a cat"

如果您能更详细地解释代码的作用,将会提高您回答的质量。为什么有人应该尝试您的代码?是否有什么可以帮助他们理解他们需要做什么? - Nigel Ren
explanation added - Elmiya Agnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接