結論
「gsubで正規表現を用いた置換を行う際、$1でグループの参照がうまくいかない場合は’\1’を使え」というお話。
$1, $2, ..., $n
のかわりに
\1, \2, ..., \n
を使え。
$1で良い場合
Regexp#matchやString#matchや「=~」を使う場合は$1で参照できる。
cool = 'coooooooooooooool'
regex = /.(o+)./
regex.match cool
puts $1
cool.match regex
puts $1
cool =~ regex
puts $1
regex =~ cool
puts $1
$1でダメな場合
String#gsubでは使えない。
どうだめなのか?
思っているように置換をしてくれない。しかし、
puts $1
で書き出すと正しく抽出できている。
cool = 'coooooooooooooool'
regex = /.(o+)./
cool.gsub(regex, "s#{$1}up")
puts $1
どうすれば良いのか
$1の代わりに\1を使いましょう。さらに普通の文字列として与えて下さい。
cool = 'coooooooooooooool'
regex = /.(o+)./
cool.gsub(regex, 's\1up')
puts $1
参考