मैं निम्नलिखित रूबी टुकड़े के लिए एक शॉर्टेंड की तलाश में हूं:
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
एक खाली सरणी देता है, इसलिए उपरोक्त सुरक्षित है।