/ / रूबी में रूचि के बाद $ 1 ... $ n से असाइन करने के लिए एक शॉर्टेंड है

रूबी - रूबी में मिलान करने के बाद $ 1 ... $ n से असाइन करने के लिए कोई शॉर्टेंड है

मैं निम्नलिखित रूबी टुकड़े के लिए एक शॉर्टेंड की तलाश में हूं:

var = "foo 123  456  789   bar";

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

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

ऐसा लगता है कि निश्चित रूप से कुछ ऐसा है (first, second, third) = .... लेकिन मुझे नहीं पता कि मैं किस अवधि की तलाश कर सकता हूं।

उत्तर:

जवाब के लिए 3 № 1

यदि तुम प्रयोग करते हो match के बजाय =~, आप वापस आ जाओ MatchData ऑब्जेक्ट, जिसमें एक विधि है captures, जो एक सरणी में कैप्चरिंग समूहों द्वारा मिलान किए गए मान देता है:

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

जवाब के लिए 3 № 2

एक और तरीका, जिसे आप जा सकते हैं:

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


उत्तर № 3 के लिए 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 एक खाली सरणी देता है, इसलिए उपरोक्त सुरक्षित है।