1

Rubyで「{}」の間のコンテンツを取得するにはどうすればよいですか? 例えば、

愛してます}

要素「あなた」を取得するにはどうすればよいですか? 内容を差し替えたい場合、「あなた」を「彼女」に変えてくださいと言うのですが、どうすればいいですか?おそらく使用していgsubますか?

4

5 に答える 5

5
replacements = {
  'you' => 'her',
  'angels' => 'demons',
  'ice cream' => 'puppies',
}

my_string = "I love {you}.\nYour voice is like {angels} singing.\nI would love to eat {ice cream} with you sometime!"

replacements.each do |source, replacement|
  my_string.gsub! "{#{source}}", replacement
end

puts my_string
# => I love her.
# => Your voice is like demons singing.
# => I would love to eat puppies with you sometime!
于 2012-08-14T00:24:31.577 に答える
4

の内部からコンテンツを取得する簡単な方法{...}は次のとおりです。

str = 'I love {you}'
str[/{(.+)}/, 1] # => "you"

それは基本的に、「先頭{から末尾までのすべてを取得します}。これは実際には洗練されておらず、ネストされた{}ペアにだまされる可能性があります。

ターゲット文字列の置換は、さまざまな方法で実行できます。

replace_str = 'her'
'I love {you}'.sub('you', replace_str) # => "I love {her}"

シンプルsubは、ターゲット文字列の最初の出現を置換テキストに置き換えます。

文字列の代わりに正規表現を使用できます。

'I love you {you}'.sub(/you/, replace_str) # => "I love her {you}"

ターゲット文字列が複数回出現する場合は、もう少しテキストを使用して検索します。これは、ラッピング区切り文字を使用して検索し、それらも置き換えます。他にも方法はありますが、私は次のようにしています。

'I love you {you}'.sub(/{.+}/, "{#{ replace_str }}") # => "I love you {her}"

アレックス・ウェインの答えは近づきましたが、完全には行きませんでした: Rubygsubには本当に素晴らしい機能があり、正規表現とハッシュを渡すことができ、正規表現一致のすべての出現をハッシュの値に置き換えます:

hash = {
  'I' => 'She',
  'love' => 'loves',
  'you' => 'me'
}
str.gsub(Regexp.union(hash.keys), hash) # => "She loves {me}"

テンプレートを取得して、その中のすべてのプレースホルダーをすばやく置き換えたい場合、これは非常に強力です。

于 2012-08-14T03:08:11.857 に答える
2

次のようなテンプレート エンジンを使用しない理由: https://github.com/defunkt/mustache

ruby は に対してこれを行うことができることに注意してください%{}:

"foo = %{foo}" % { :foo => 'bar' }
#=> "foo = bar"

最後に、既存のRuby テンプレート エンジンを確認することを忘れないでください。車輪を再発明しないでください。

于 2012-08-14T00:38:43.860 に答える
2

いつでも .index を使用できます。

a = 'I love {bill gates}'
a[a.index('{')+1..a.index('}')-1]

最後の行は、'{' の最初の出現の直後と '}' の最初の出現の直前から 'a' を取得することを示しています。ただし、これは {} の最初の出現の間のテキストのみを取得することに注意してください。したがって、上記の例で機能します。

{} の間に何か新しいものを追加するためにも、インデックス作成を使用します。

それは次のようになります。

a[0..a.index('{')] + 'Steve Jobs' + a[a.index('}')..-1]

繰り返しますが、これは「{」と「}」が最初に出現した場合にのみ機能します。

マイケル G.

于 2012-08-14T00:21:02.527 に答える
1

正規表現は、gsub を使用する方法です。何かのようなもの:

existingString.gsub(/\{(.*?)\}/) { "her" }
于 2012-08-14T00:17:37.990 に答える