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

在Ruby中,如何用哈希集合值替换字符串?,ruby,Ruby,我有一个散列集合: my_hash={“1”=>“苹果”、“2”=>“蜜蜂”、“3”=>“猫”} 我将使用什么语法将字符串中第一次出现的键替换为哈希集合值 例如我的输入字符串: str=我想要一个3 结果字符串将是: str=我想要一只猫你可以在ruby 1.9中使用: string.sub(key, hash[key]) 我不明白你的问题,但你可以试试这个: my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"} str

我有一个散列集合:
my_hash={“1”=>“苹果”、“2”=>“蜜蜂”、“3”=>“猫”}

我将使用什么语法将字符串中第一次出现的
替换为哈希集合

例如我的输入字符串:
str=我想要一个3

结果字符串将是:
str=我想要一只猫

你可以在ruby 1.9中使用:

string.sub(key, hash[key])

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

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

我的一行:

hash.each { |k, v| str[k] &&= v }
或者使用
String#sub方法:

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

只需在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(:[]))
如果要替换的字符串没有任何常规模式,可以使用:

str.sub /#{my_hash.keys.map { |s| Regexp.escape s }.join '|'}/, my_hash
但如果有,代码会变得简单得多,例如:

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

如果要替换所有引用,而不仅仅是第一个引用,请使用gsub。

假设Ruby 1.9或更高版本:

str.gsub /\d/, my_hash

以下代码将给定字符串
str

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

关于输入字符串有哪些假设?通常,像这样的模板语言会以某种方式标记它,比如
str=I want a{3}
(.NET字符串格式);到目前为止你的代码是什么?你的问题是什么?…显然我错了。正如下面所证明的,显然我们都非常渴望帮助,以至于我们将代码分发给新用户。欢迎使用堆栈溢出!;)如果可能的话,我会使用Ruby 2.0的内置字符串模板功能。给定一个带有符号键的散列,
h={pet:“cat”}
你可以这样做:
“我想要一只%{pet}”%h#=>“我想要一只猫”
IMHO它有点过载。嘿,我喜欢这个让我头晕目眩的。(我想+1你,但我今天出去了。;)+1(当我得到选票时)支持使用
String#[]=
&&=
。有人能解释第一个线性函数的作用吗?因为Ruby中的布尔运算符短路,所以当且仅当第一个参数为真时才计算第二个参数。
字符串#[]
如果给定了字符串,则找到它并返回对它的子字符串引用。所以,如果我们给它赋值,我们将改变字符串的给定部分。最后我们把它连接在一起,若在字符串中找到子字符串,那个么用哈希值替换它。卢卡斯,干得好。一个更正:你需要使用“sub!”方法,而不是“sub”方法,以便第二个示例正常工作潜艇改变字符串的位置。(或者使用“gsub!”替换字符串中出现的所有匹配项。)如果您能够提供更多关于代码功能的解释,将提高答案的质量。为什么有人要尝试你的代码,有什么可以帮助他们理解他们需要做什么吗?解释added@Oleksi你的意思是
hash
not
hash[key]
即我的hash={“1”=>“apple”,“2”=>“bee”,“3”=>“cat”}我的str='i want a 3'放入我的str.sub('3',my#u hash)=>“i want a cat”
"I want a %{b}" % {c: "apple", b: "bee", a: "cat"}
=> "I want a bee"
 str.gsub(/\w+/) { |m| my_hash.fetch(m,m)}
    => "I want a cat"