Edited at

Rubyのsub,gsubでマッチした部分を取り出す

More than 3 years have passed since last update.

今更ながら地味にはまってしまったのでメモ

ちなみに$1,$2...って組み込み変数って言うんですね


間違った方法

p 'aiueo'.gsub(/(e)/, "#{$1}")

とした時に$1eが入ってると思ったら間違いで


この文字列が評価される時点ではまだ正規表現マッチが行われておらず、 $1 がセットされていない


だそうです


正しい方法

その1

文字列で処理する方法

p 'aiueo'.gsub(/(e)/, "\\1")

p 'aiueo'.gsub(/(e)/, '\1')
p 'aiueo'.gsub(/(e)/, '\\1')

その2

ブロックを渡す方法

p 'aiueo'.gsub(/(e)/) { $1 }

こちらの場合は$1,$2...が使えるみたいです


参考

リファレンスにも書いてあることだったので、詳しくは以下 

instance method String#gsub