String#matchの正規表現にマッチした物が無い時に特殊変数に入る値について

投稿者: Anonymous

文字列をマッチさせて数値に変換する時に

'10'.match(/(100)/){ $1 } # => nil

なので、to_iをつければ0を返してくるかと思ったのですが、変わらずnilを返してきます。

'10'.match(/(100)/){ $1.to_i } # => nil

不思議だったのでクラス名を取ろうと思ったのですが

'10'.match(/(100)/){ p $1.class } # => nil

でも何も返ってきません。
正規表現でマッチした値を返す $1 などの特殊変数はどう規定されていて
どこのドキュメントに振る舞いが書かれているのでしょうか?

解決

マッチしなかった場合、ブロックは実行されません。

ri String.match より:

If a block is given, invoke the block with MatchData if match succeed

$1 などの変数については、ri Regexp (Special global variables) には以下のような記載があります。マッチさせた時点で、該当するデータが無いもの (キャプチャの括弧が1個の場合で $2 を参照した場合など; 失敗した場合を含む) は nil になりますが、明確な記載は見つけられませんでした。

$1, $2 and so on contain text matching first, second, etc capture group

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *