我要尋找以下紅寶石片段的速記:
var = 'foo 123 456 789 bar';
var =~ /^foo +(\d+) +(\d+) +(\d+) +bar$/;
first=$1
second=$2
third=$3
在我看來,那肯定是有類似(first, second, third) = ....
但我不知道我可以去找那個詞。
我要尋找以下紅寶石片段的速記:
var = 'foo 123 456 789 bar';
var =~ /^foo +(\d+) +(\d+) +(\d+) +bar$/;
first=$1
second=$2
third=$3
在我看來,那肯定是有類似(first, second, third) = ....
但我不知道我可以去找那個詞。
如果使用match
代替=~
,你回到一個MatchData
對象,其具有方法captures
,它返回被捕獲組在陣列中相匹配的值:
first, second, third = var.match(/.../).captures
的另一種方式,你可以去:
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
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
返回一個空數組,所以以上是安全的。
如果你確定拋出一個不匹配的異常,你可以執行'a,b,c = re.match(str)[1 ..- 1]' – 2010-12-17 22:12:08
忘掉';' – Nakilon 2010-12-17 17:01:07