私はルビーに比較的慣れていないので、正規表現のグループ化に基づいて、文字列から複数の値を抽出する「ruby」の方法を理解します。私はRuby1.8を使用しています(したがって、キャプチャに名前を付けたとは思いません)。
一致させて$ 1、$ 2を割り当てることもできますが、もっとエレガントな方法が必要だと思います(結局、これはルビーです)。
私もgrepで動作するものを持っていますが、配列を使用して最初の要素を取得しているだけなので、ハックのようです。
input="FOO: 1 BAR: 2"
foo, bar = input.grep(/FOO: (d+) BAR: (d+)/){[$1,$2]}[0]
p foo
p bar
オンラインで検索して閲覧してみました ルビードキュメント、しかし、より良いものを理解することはできませんでした。
回答:
回答№1の場合は3ルビーズ String#match メソッドはaを返します MatchData メソッドを持つオブジェクト 捕獲 キャプチャの配列を返します。
>> string = "FOO: 1 BAR: 2"
=> "FOO: 1 BAR: 2"
>> string.match /FOO: (d+) BAR: (d+)/
=> #<MatchData "FOO: 1 BAR: 2" 1:"1" 2:"2">
>> _.captures
=> ["1", "2"]
>> foo, bar = _
=> ["1", "2"]
>> foo
=> "1"
>> bar
=> "2"
要約する:
foo, bar = input.match(/FOO: (d+) BAR: (d+)/).captures
回答№2の場合は1
どちらか:
foo, bar = string.scan(/[A-Z]+: (d+)/).flatten
または:
foo, bar = string.match(/FOO: (d+) BAR: (d+)/).captures
回答№3の場合は1
代わりにスキャンを使用してください:
input="FOO: 1 BAR: 2"
input.scan(/FOO: (d+) BAR: (d+)/) #=> [["1", "2"]]