次のような行が与えられた場合
1ポンドの牛肉
成分を抽出したい。最初は成分名だけに興味があります。
ruby の有名な時刻パーサー Chronic を見て、その正規表現の使用が気に入りました。
def self.scan_for_month_names(token)
scanner = {/^jan\.?(uary)?$/ => :january,
/^feb\.?(ruary)?$/ => :february,
/^mar\.?(ch)?$/ => :march,
/^apr\.?(il)?$/ => :april,
/^may$/ => :may,
/^jun\.?e?$/ => :june,
/^jul\.?y?$/ => :july,
/^aug\.?(ust)?$/ => :august,
/^sep\.?(tember)?$/ => :september,
/^oct\.?(ober)?$/ => :october,
/^nov\.?(ember)?$/ => :november,
/^dec\.?(ember)?$/ => :december}
scanner.keys.each do |scanner_item|
return Chronic::RepeaterMonthName.new(scanner[scanner_item]) if scanner_item =~ token.word
end
return nil
終わり
ただし、私の場合、おそらく個々の成分ごとに 300 以上の正規表現を作成する必要があります。
また、コリアンダーやコリアンダー リーフなどの同義語も考慮する必要があります。
これまで解析を行ったことはありませんが、ここで正規表現を使用するのが最善の方法です。他に合理的な代替案が思い浮かびません。