dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

gsubで正規表現を用いた置換を行う際、$1でグループの参照がうまくいかない場合は'\1'を使え

結論

「gsubで正規表現を用いた置換を行う際、$1でグループの参照がうまくいかない場合は’\1’を使え」というお話。
$1, $2, ..., $nのかわりに\1, \2, ..., \nを使え。

$1で良い場合

Regexp#matchやString#matchや「=~」を使う場合は$1で参照できる。
cool = 'coooooooooooooool'
regex = /.(o+)./

regex.match cool
puts $1
# => "ooooooooooooooo"

cool.match regex
puts $1
# => "ooooooooooooooo"

cool =~ regex
puts $1
# => "ooooooooooooooo"

regex =~ cool
puts $1
# => "ooooooooooooooo"

$1でダメな場合

String#gsubでは使えない。

どうだめなのか?

思っているように置換をしてくれない。しかし、puts $1で書き出すと正しく抽出できている。
# ※$1には値が既に入ってしまっているため、ここでpryを再起動し$1.nil? == trueにしてあります

cool = 'coooooooooooooool'
regex = /.(o+)./

cool.gsub(regex, "s#{$1}up")
# => "sp"
puts $1
# => "ooooooooooooooo"

どうすれば良いのか

$1の代わりに\1を使いましょう。さらに普通の文字列として与えて下さい。
# ※$1には値が既に入ってしまっているため、ここでpryを再起動し$1.nil? == trueにしてあります

cool = 'coooooooooooooool'
regex = /.(o+)./

cool.gsub(regex, 's\1up')
# => "soooooooooooooooup"
puts $1
# => "ooooooooooooooo"

参考