我正在寻找以下ruby片段的简写:
var = 'foo 123 456 789 bar';
var =~ /^foo +(\d+) +(\d+) +(\d+) +bar$/;
first=$1
second=$2
third=$3
在我看来,肯定有类似(first, second, third) = ....
的内容,但我不知道我可以去寻找它。
答案 0 :(得分:3)
如果您使用match
而不是=~
,则会返回MatchData
对象,该对象具有方法captures
,该对象返回与捕获组匹配的值一个数组:
first, second, third = var.match(/.../).captures
答案 1 :(得分:3)
另一种方法,你可以去:
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/ruby-1.9/classes/Regexp.html#M001100
答案 2 :(得分:1)
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
会返回一个空数组,因此上述内容是安全的。