文字列内の複数パターン置換をHashで行う

半年くらい前に自作したスクリプトに組み込んだ処理なのに、どこのサイトでやり方を調べたのか忘れてしまった。たぶん、「Ruby 置換 Hash」とかで調べて、なるほどふむふむと思いながら実装したんだろう、String#gsub(pattern, hash) とすることで複数置換ができる。

str = "first second third"
gsubhash = { "first"=>"Mike","second"=>"Johnny","third"=>"Tom" }
p str.gsub(Regexp.union(gsubhash.keys), gsubhash)
 #=> "Mike Johnny Tom"

gsubで置換するところ、正規表現を与えるのに Regexp#union とすればよいのだと、調べる過程で初めて知った。自分が当初書いていたスクリプトでは、Array#join を使ってなんか無理矢理感を出していた。

p str.gsub(/#{gsubhash.keys.join('|')}/, gsubhash)

weblog.2410.dev