/ / Правильний спосіб вилучення декількох значень із рядка за допомогою регулярного виразу в ruby ​​1.8 - ruby, регулярний вираз, рядок, ruby-1.8

Правий спосіб вилучення декількох значень з рядка з використанням регулярного виразу в ruby ​​1.8 - ruby, regex, string, ruby-1.8

Я відносно новачок у рубіні, і намагаюсяз'ясувати "рубіновий" спосіб вилучення декількох значень із рядка на основі групування у регулярні вирази. Я використовую 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"]]