LoginSignup
7
7

More than 1 year has passed since last update.

Ruby | 正規表現の条件式に変数を使うと、名前付きキャプチャによる変数代入が出来ない

Last updated at Posted at 2016-01-19

基本動作

正規表現 ( 左辺に条件式があるやつ ) で、名前付きキャプチャを使うと。
ローカル変数に値が代入される。

/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オープンチャットもご利用ください。

メンター受付

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7