正規表現でマッチした箇所と、その前後を取り出す

Regexp#matchを使うと、MatchDataオブジェクトが返される。
そしてMatchDataを使えば、マッチした結果の詳細を見ることができる。

  • MatchData#[n] ・・・ n番目にマッチした部分の文字列
  • MatchData#pre_match ・・・ マッチした部分より前の文字列
  • MatchData#post_match ・・・ マッチした部分より後の文字列

例えば、$を含む文字列にマッチした結果を見てみると以下のようになる。

ary = [
       'Hoge$1.class',
       'Hoge$Fuga.class',
       'Hoge$Fuga$Piyo.class',
      ]

ary.each{|item|
  if m = /\$/.match(item)
    puts "target: #{item}"
    puts "pre_match: #{m.pre_match}"
    puts "match: #{m[0]}"
    puts "post_match: #{m.post_match}"
    puts 
  end
}


実行結果。
これで、正規表現を適用した結果が、
自分の意図したものになっているかどうかが調べられる。

target: Hoge$1.class
pre_match: Hoge
match: $
post_match: 1.class

target: Hoge$Fuga.class
pre_match: Hoge
match: $
post_match: Fuga.class

target: Hoge$Fuga$Piyo.class
pre_match: Hoge
match: $
post_match: Fuga$Piyo.class