.*
任意の文字を意味するのに、なぜ.*?
次の文字が必要なのですか?
str.gsub(/\#{(.*?)}/) {eval($1)}
.*
は貪欲な一致です.*?
が、 は非貪欲な一致です。それらの簡単なチュートリアルについては、このリンクを参照してください。貪欲な一致は可能な限り一致しますが、貪欲でない一致は可能な限り一致しません。
この例では、貪欲なバリアントは、最初{
と最後}
(最後の右中かっこ) の間のすべてを取得します。
'start #{this is a match}{and so is this} end'.match(/\#{(.*)}/)[1]
# => "this is a match}{and so is this"
一方、貪欲ではないバリアントは、一致するために必要なだけしか読み取らないため、最初{
と最初の連続する}
.
'start #{this is a match}{and so is this} end'.match(/\#{(.*?)}/)[1]
# => "this is a match"