Есть ли сокращение для назначения от $ 1 ... $ n после сопоставления в ruby? - PullRequest
2 голосов
/ 17 декабря 2010

Я ищу сокращение для следующего фрагмента рубина:

var = 'foo 123  456  789   bar';

var =~ /^foo +(\d+) +(\d+) +(\d+) +bar$/;

first=$1
second=$2
third=$3

Мне кажется, что, безусловно, есть что-то вроде (first, second, third) = ...., но я не знаю, с каким термином я мог бы обратитьсяэто.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Другой путь, по которому вы можете пойти:

var = 'foo 123  456  789   bar'
/^foo +(?<first>\d+) +(?<second>\d+) +(?<third>\d+) +bar$/ =~ var

Это автоматически присваивает захваты локальным переменным.
Примечание: str =~ regexp не будет работать здесь. Только regexp =~ str.

Насколько я знаю, это особенность движка Oniguruma, поэтому он работает в 1.9
http://www.ruby -doc.org / рубин-1.9 / классы / Regexp.html # M001100

3 голосов
/ 17 декабря 2010

Если вы используете match вместо =~, вы получите объект MatchData, который имеет метод captures, который возвращает значения, соответствующие группам захвата в массиве:

first, second, third = var.match(/.../).captures
1 голос
/ 17 декабря 2010
str = 'foo 123  456  789   bar'
re  = /^foo +(\d+) +(\d+) +(\d+) +bar$/
p re.match(str).to_a
#=> ["foo 123  456  789   bar", "123", "456", "789"]

_, a, b, c = re.match(str).to_a
p [a,b,c]
#=> ["123", "456", "789"]

Обратите внимание, что Regex#match вернет nil, если совпадений не найдено, но nil.to_a вернет пустой массив, поэтому приведенное выше безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...