基本動作
正規表現 ( 左辺に条件式があるやつ ) で、名前付きキャプチャを使うと。
ローカル変数に値が代入される。
/a (?<month>July)/ =~ 'Ruby is a July birth stone'
month # => "July"
問題
ところが。
マッチの条件の中に変数を使うと、ローカル変数が作られない。
a = 'a'
/#{a} (?<month>July)/ =~ 'Ruby is a July birth stone' # => 8
month #=> #<NameError: undefined local variable or method `month' for main:Object>
マッチ自体は成功しているのに。変数 month
は存在しない。
解決
同じような書き方でも。
#match
メソッドを使えば正常にキャプチャできる。
a = 'a'
'Ruby is a July birth stone'.match(/#{a} (?<month>July)/) { |matched| matched[:month] } # => July
いいね!
ただし #match
の場合。ローカル変数 month
は作られない。
どうしても作りたい場合は、返り値に代入すれば良いだろう。
a = 'a'
month = 'Ruby is a July birth stone'.match(/#{a} (?<month>July)/) { |matched| matched[:month] }
month # => "July"
注意
#match
メソッドにも問題がある。
上記の書き方であれば大丈夫だが。他の書き方でキャプチャ結果を使う場合は注意だ。
Ruby | 正規表現のキャプチャでマッチしなかった時の NoMethodError に対策する
環境
- Ruby 2.2.4
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
メンター受付