正規表現の選択

正規表現の選択(|)の優先順位は低いので注意が必要です。
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を参考にしています)