2010-12-17 6 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

答えて

3

あなたがmatch代わりの=~を使用する場合は、配列内のキャプチャグループにマッチした値を返すメソッドcapturesを、持っているMatchDataオブジェクト、取り戻す:

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

数日前、私は初めてRubyで' match'を使用しました。これはまさにこの目的だった) – Nakilon

+1

これは、一致が失敗すると '#match'は' nil'を返し、 'nil.captures'は' nil.to_a'とは異なり、それほど熱くないという問題があることに注意してください。 – Phrogz

+2

試合に失敗したことは誰が聞いたことがありますか?私は誰もが悪いパターンを書いている手を挙げる...ハァッ... 1、2 ...ああ...みんな。 :-) –

3

に別の方法を、これを使用できるか:

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

これは自動的にローカル変数にキャプチャを割り当てます。
注:str =~ regexpはここでは機能しません。のみregexp =~ str

それは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#matchnilを返しますが、nil.to_aは空の配列を返すことに注意してください動作しますので、私の知る限りでは、それは、鬼車のエンジンの機能です上記は安全です。

+0

もしあなたが大文字小文字を区別しないためにスローされた場合、 'a、b、c = re.match(str)[1 ..- 1]' –

関連する問題