Я відносно новачок у рубіні, і намагаюсяз'ясувати "рубіновий" спосіб вилучення декількох значень із рядка на основі групування у регулярні вирази. Я використовую ruby 1.8 (тому я не думаю, що назвав захоплення).
Я міг би просто зіставити, а потім призначити $ 1, $ 2 - але я відчуваю, що це має бути більш елегантний спосіб (зрештою, це рубін).
У мене також щось працює з grep, але це здається хакерською, оскільки я використовую масив і просто захоплюю перший елемент:
input="FOO: 1 BAR: 2"
foo, bar = input.grep(/FOO: (d+) BAR: (d+)/){[$1,$2]}[0]
p foo
p bar
Я спробував шукати в Інтернеті та переглядати рубінові документи, але не змогли зрозуміти нічого кращого.
Відповіді:
3 для відповіді № 1Рубіс Рядок # збіг метод повертає 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
1 для відповіді № 2
Або:
foo, bar = string.scan(/[A-Z]+: (d+)/).flatten
або:
foo, bar = string.match(/FOO: (d+) BAR: (d+)/).captures
1 для відповіді № 3
Замість цього використовуйте сканування:
input="FOO: 1 BAR: 2"
input.scan(/FOO: (d+) BAR: (d+)/) #=> [["1", "2"]]