2010-12-17 26 views
2

我要尋找以下紅寶石片段的速記:

var = 'foo 123 456 789 bar'; 

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

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

在我看來,那肯定是有類似(first, second, third) = ....但我不知道我可以去找那個詞。

+1

忘掉';' – Nakilon 2010-12-17 17:01:07

回答

3

如果使用match代替=~,你回到一個MatchData對象,其具有方法captures,它返回被捕獲組在陣列中相匹配的值:

first, second, third = var.match(/.../).captures 
+0

幾天前我第一次在Ruby中使用'match'。正是這個目的) – Nakilon 2010-12-17 17:10:23

+1

請注意,如果匹配失敗,'#match'返回'nil','nil.captures'不會太熱(不像'nil.to_a')。 – Phrogz 2010-12-17 17:15:35

+2

誰曾經聽說過比賽失敗?我的意思是,每個人都舉起手寫出一個不好的模式......呃......一,二......哦......每個人。 :-) – 2010-12-17 20:06:01

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

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返回一個空數組,所以以上是安全的。

+0

如果你確定拋出一個不匹配的異常,你可以執行'a,b,c = re.match(str)[1 ..- 1]' – 2010-12-17 22:12:08