正規表現でマッチした箇所と、その前後を取り出す
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