13

I have a hash collection: my_hash = {"1" => "apple", "2" => "bee", "3" => "cat"}

What syntax would I use to replace the first occurrence of the key with hash collection value in a string?

eg my input string: str = I want a 3

The resulting string would be: str = I want a cat

4

8 に答える 8

20

私のワンライナー:

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

またはString#sub!方法を使用する:

hash.each { |k, v| str.sub!(k, v) }
于 2012-04-09T22:36:58.150 に答える
15
"I want a %{b}" % {c: "apple", b: "bee", a: "cat"}
=> "I want a bee"
于 2015-03-17T19:22:52.883 に答える
4

Ruby 1.9 以降の場合:

str.gsub /\d/, my_hash
于 2014-06-10T20:49:15.283 に答える
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(:[]))
于 2012-04-09T22:56:33.467 に答える
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

于 2012-04-09T22:34:57.607 に答える
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

しかし、1 つある場合、コードははるかに単純になります。

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

最初のものだけでなく、すべての出現箇所を置き換えたい場合は、gsub を使用します。

于 2012-11-25T23:46:35.050 に答える
0

Ruby 1.9ではString.subを使用できます。

string.sub(key, hash[key])
于 2012-04-09T22:33:22.893 に答える