正規表現の選択
正規表現の選択(|)の優先順位は低いので注意が必要です。
1. 以下のプログラムは、メールの中から「行頭にFrom:またはSubject:を含む行を抽出する」ものですが、期待はずれに終わります。
# 期待はずれ require 'pathname' Pathname.new('girl.mbox').open('r') do |f| while line = f.gets puts line if /^From|Subject:/ =~ line end end
なぜなら、正規表現/^From|Subject:/では、「行頭のFrom」または「行のどこかにあるSubject:」にマッチするからです。
2. 以下のようにかっこでくくります。
# 期待に合う require 'pathname' Pathname.new('girl.mbox').open('r') do |f| while line = f.gets puts line if /^(From|Subject):/ =~ line end end
(このエントリは『詳説 正規表現 第2版』p.13を参考にしています)