str = "Hello☺ World☹"
期待される出力は次のとおりです。
"Hello:) World:("
私がすることができます:str.gsub("☺", ":)").gsub("☹", ":(")
1回の関数呼び出しでこれを実行できる他の方法はありますか?何かのようなもの:
str.gsub(['s1', 's2'], ['r1', 'r2'])
Ruby 1.9.2以降String#gsub
、一致したキーと置き換えるための2番目のパラメーターとしてハッシュを受け入れます。正規表現を使用して、置換する必要のある部分文字列を照合し、置換する値のハッシュを渡すことができます。
このような:
'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*') #=> "h3ll*"
'(0) 123-123.123'.gsub(/[()-,. ]/, '') #=> "0123123123"
Ruby 1.8.7では、ブロックを使用して同じことを実現します。
dict = { 'e' => 3, 'o' => '*' }
'hello'.gsub /[eo]/ do |match|
dict[match.to_s]
end #=> "h3ll*"
マッピングテーブルを設定します。
map = {'☺' => ':)', '☹' => ':(' }
次に、正規表現を作成します。
re = Regexp.new(map.keys.map { |x| Regexp.escape(x) }.join('|'))
そして最後にgsub
:
s = str.gsub(re, map)
1.8の土地で立ち往生している場合は、次のようにします。
s = str.gsub(re) { |m| map[m] }
Regexp.escape
置き換えたいものが正規表現内で特別な意味を持つ場合に備えて、そこに必要です。または、steenslagのおかげで、次を使用できます。
re = Regexp.union(map.keys)
見積もりはあなたのために世話をします。
あなたはこのようなことをすることができます:
replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
より効率的な解決策があるかもしれませんが、これは少なくともコードを少しきれいにします
パーティーに遅れましたが、特定の文字を1つに置き換えたい場合は、正規表現を使用できます
string_to_replace.gsub(/_|,| /, '-')
この例では、gsubはアンダースコア(_)、コンマ(、)、または()をダッシュ(-)に置き換えています。
もう1つの簡単な方法でありながら、読みやすい方法は次のとおりです。
str = '12 ene 2013'
map = {'ene' => 'jan', 'abr'=>'apr', 'dic'=>'dec'}
map.each {|k,v| str.sub!(k,v)}
puts str # '12 jan 2013'
trを使用して、文字列内の複数の文字を一度に置き換えることもできます。
たとえば、「h」を「m」に、「l」を「t」に置き換えます。
"hello".tr("hl", "mt")
=> "metto"
gsubよりもシンプルで、きちんとしていて、高速に見えます(ただし、それほど違いはありません)。
puts Benchmark.measure {"hello".tr("hl", "mt") }
0.000000 0.000000 0.000000 ( 0.000007)
puts Benchmark.measure{"hello".gsub(/[hl]/, 'h' => 'm', 'l' => 't') }
0.000000 0.000000 0.000000 ( 0.000021)
上記のナレンの答えをリフして、私は
tr = {'a' => '1', 'b' => '2', 'z' => '26'}
mystring.gsub(/[#{tr.keys}]/, tr)
したがって、
「26e2r112626ee2r1」を'zebraazzeebra'.gsub(/[#{tr.keys}]/, tr)
返します