web-dev-qa-db-ja.com

Ruby複数の文字列の置換

_str = "Hello☺ World☹"
_

予想される出力は次のとおりです。

_"Hello:) World:("
_

これを行うことができます:str.gsub("☺", ":)").gsub("☹", ":(")

単一の関数呼び出しでこれを行うことができる他の方法はありますか?何かのようなもの:

_str.gsub(['s1', 's2'], ['r1', 'r2'])
_
65
Sayuj

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*"
109
Naren Sisodiya

マッピングテーブルを設定します。

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)

引用はあなたのために世話をします。

36
mu is too short

次のようなことができます:

replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}

より効率的なソリューションがあるかもしれませんが、これは少なくともコードを少しきれいにします

35
Nathan Manousos

パーティーに遅れましたが、特定の文字を1つに置き換えたい場合は、正規表現を使用できます

string_to_replace.gsub(/_|,| /, '-')

この例では、gsubはアンダースコア(_)、コンマ(、)または()をダッシュ​​(-)に置き換えています

18
lsaffie

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)
4
YasirAzgar

別の簡単な方法でありながら読みやすいのは次のとおりです。

str = '12 ene 2013'
map = {'ene' => 'jan', 'abr'=>'apr', 'dic'=>'dec'}
map.each {|k,v| str.sub!(k,v)}
puts str # '12 jan 2013'
4
Diego Dorado

上記のナレンの答え のリフティング、私は

_tr = {'a' => '1', 'b' => '2', 'z' => '26'}
mystring.gsub(/[#{tr.keys}]/, tr)
_

'zebraazzeebra'.gsub(/[#{tr.keys}]/, tr) "26e2r112626ee2r1"を返します

1
gitb