1

データベース内のレコードの文字列から意味を抽出するメソッドを開発する必要があります。文字列の例を次に示します。

MyString = "Purse $75,000. (up To $14,250 Nysbfoa) For Maidens, Fillies And Mares Three Years Old And Upward. Three Year Olds, 118 Lbs.; Older, 123 Lbs. One And One Eighth Miles. (Inner turf)"    

文字列が与えられたら、race_recordを作成できるように処理する必要があります。

race_record[:purse] = 75000 
race_record[:race_type] = "Maidens"
race_record[:sex] = "Fillies And Mares"
race_record[:age] = "Three Year Old And Upward"
race_record[:distance] = "One And One Eighth Miles"
race_record[:surface] = "inner turf"

私は、ルビーと一連の正規表現を使用してデータを抽出することを計画していました。例えば:

race_record[:purse] = Mystring.scan(/(?<=\Purse\s[$])(.*?)(?=\.)/)
race_record[:race_type] = Mystring.sub(....)
etc.

私の質問は、正しい正規表現が何であるかということではありません。目的を考えると、私が提案したアプローチは正しい方法ですか、それともより良いアプローチ、あるいは重労働を行うことができる宝石さえありますか?

4

2 に答える 2

1

1つの正規表現を使用して、関連するすべての部分をキャプチャグループに一度に抽出できます。

regexp = 
    /Purse\s\$          # Leading text
    ([\d,]+)            # Group 1
    .*?For\s            # Intervening text
    (\w+)               # Group 2
    ,\s                 # Intervening text
    (\w+\sAnd\s\w+)     # Group 3, etc. etc.
    \s
    ([^.]*)
    \.[^;]*;[^.]*\.\s
    ([^.]*)
    \.\s\(
    ([^()]*)
    \)/x

その後、あなたはすることができます

irb(main):025:0> match = regexp.match(mystring)
=> #<MatchData "Purse $75,000. (up To $14,250 Nysbfoa) For Maidens, Fillies And    Mares Three Years Old And Upward. Three Year Olds, 118 Lbs.; Older, 123 Lbs. One And One Eighth Miles. (Inner turf)" 
   1:"75,000" 2:"Maidens" 3:"Fillies And Mares" 4:"Three Years Old And Upward" 
   5:"One And One Eighth Miles" 6:"Inner turf">
irb(main):026:0> match[1]
=> "75,000"
irb(main):027:0> match[2]
=> "Maidens"
...etc.
于 2012-09-30T15:43:29.547 に答える
1

入力がかなり構造化されている場合、つまり特定の既知の文法がある場合は、「パーサー」を作成して文法を解析できます。

昔は、コンパイラの構築に使用されていた2つの古いUNIXツールであるyaccとlexを使用してこれを実行していました。YaccとLexにはRubyの実装があります。元々の目的は低レベルのコード(実際のコンパイラを構築するときのマシンアセンブリコードなど)を出力することでしたが、特定の文法構造がパーサーによって認識されたときにルビーコードを呼び出すことを妨げるものは何もありません。

注:Yacc / lex Rubyの宝石が出回っていても、「重いリフティングを行う」とは言えません。yaccとlexを学習すると、学習曲線が小さくなります。yacc / lexのようなものを使用すると、特に文法が大きく、常に調整する必要がある場合に、長期的には生活が楽になります。

于 2012-09-30T15:50:36.963 に答える