在ruby中匹配后是否有从$ 1 ... $ n分配的简写

时间:2010-12-17 16:54:40

标签: ruby

我正在寻找以下ruby片段的简写:

var = 'foo 123  456  789   bar';

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

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

在我看来,肯定有类似(first, second, third) = ....的内容,但我不知道我可以去寻找它。

3 个答案:

答案 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会返回一个空数组,因此上述内容是安全的。

相关问题