String#sub(pattern, replace)
は、文字列の中でパターンに一致した最初の文字列を、指定した文字列 replace
に置換した文字列を返します。
s1 = 'AAABBBCCCAAA'
s2 = s1.sub('AAA', 'XXX') #=> "XXXBBBCCCAAA"
sub
の代わりに sub!
を使用すると、自分自身の文字列を書き換えます。
String#sub
の代わりに、String#gsub
を使用すると、パターンに一致したすべての文字列を置換します。
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#sub
や String#gsub
の第2パラメータで置き換え後の文字列を指定する代わりに、置換処理を表すブロックを指定することもできます。
ブロックでの評価結果の文字列が置換後の文字列となるため、非常に柔軟に置換処理を記述することができます。
ブロックの中で部分一致文字列(パターン内で (
と )
で囲んだ部分)を参照するには、Ruby の組み込み変数である $1
や $2
を使用します(正規表現の場合の \1
や \2
とは異なるので注意してください)。
s1 = 'It costs 100 dollars'
s2 = s1.gsub(/(\d+) dollars/) { ($1.to_i * 120).to_s + ' yen' }
実行結果
It costs 12000 yen
s1 = 'orange lemon apple peach'
s2 = s1.gsub(/a.+?\b/) {|s| s.upcase }
実行結果
orANGE lemon APPLE peACH