まくまくRubyノート
文字列を置換する (sub/gsub)
2011-10-07

最初に見つかった文字列だけ置換 (sub)

String#sub(pattern, replace) は、文字列の中でパターンに一致した最初の文字列を、指定した文字列 replace に置換した文字列を返します。

例: 最初に見つかった AAA を XXX に置換

s1 = 'AAABBBCCCAAA'
s2 = s1.sub('AAA', 'XXX')  #=> "XXXBBBCCCAAA"

sub の代わりに sub! を使用すると、自分自身の文字列を書き換えます。

すべての文字列を置換 (gsub)

String#sub の代わりに、String#gsub を使用すると、パターンに一致したすべての文字列を置換します。

例: すべての AAA を XXX に置換

s1 = 'AAABBBCCCAAA'
s2 = s1.gsub('AAA', 'XXX')  #=> "XXXBBBCCCXXX"

gsub の代わりに gsub! を使用すると、自分自身の文字列を書き換えます。

正規表現でパターンを指定して置換する

検索するパターンに /pattern/ という形式で正規表現を指定することもできます。 パターン内の任意の部分を () で囲んでおくことにより、置換文字列でその文字列を参照 (\1, \2, \3, …) できます。

例: <> で囲まれた文字列を [] で囲まれた文字列に置換

s1 = 'Hello <b>maku</b>'
s2 = s1.gsub(/<(.+?)>/, '[\1]')  #=> "Hello [b]maku[/b]"

最短一致させるために、.+ でなく .+? と指定していることに注意してください。 この ? を忘れると、<b> ではなく、<b>maku</b> にマッチしてしまいます。

ブロックを指定して柔軟な置換処理を行う

String#subString#gsub の第2パラメータで置き換え後の文字列を指定する代わりに、置換処理を表すブロックを指定することもできます。 ブロックでの評価結果の文字列が置換後の文字列となるため、非常に柔軟に置換処理を記述することができます。

ブロックの中で部分一致文字列(パターン内で () で囲んだ部分)を参照するには、Ruby の組み込み変数である $1$2 を使用します(正規表現の場合の \1\2 とは異なるので注意してください)。

例: ドル表示を円表示に変換(1ドル120円で計算)

s1 = 'It costs 100 dollars'
s2 = s1.gsub(/(\d+) dollars/) { ($1.to_i * 120).to_s + ' yen' }

実行結果

It costs 12000 yen

例: ‘a’ という文字が見つかったら単語の切れ目までを大文字にする

s1 = 'orange lemon apple peach'
s2 = s1.gsub(/a.+?\b/) {|s| s.upcase }

実行結果

orANGE lemon APPLE peACH
2011-10-07