Ruby Tips!

RubyのTipsを紹介します

正規表現で繰り返しマッチさせる

正規表現でマッチしたより後ろの文字列は組み込み変数$'で参照することができる。正規表現によるマッチと$'の参照を繰り返し行うことで、徐々に正規表現のマッチを進めていくことが可能だ。

str = "abc def ghi"
p str.slice(/abc/) #=> "abc"
p $' #=> " def ghi"
p $'.slice(/def/) #=> "def"
p $' #=> " ghi"
p $'.slice(/ghi/) #=> "ghi"
p $' #=> ""

組み込み変数$.を参照するのはマルチスレッドの場合に問題になる。そのような場合は正規表現によるマッチをString#matchにより行い、MatchData#post_matchを参照することで、同様に処理できる。

str = "abc def ghi"
m = str.match(/abc/) #=> "abc"
p m[0] #=> "abc"
p m.post_match #=> " def ghi"

単に正規表現にマッチした部分文字列をすべて抜き出したいのであれば、String#scanを使うことができる。

p "abc def ghi".scan(/\w+/) #=> ["abc", "def", "ghi"]