2011-07-23 6 views
60

मुझे पता है कि मैं एक नियमित अभिव्यक्ति के खिलाफ एक मैच की जांच करने के लिए रूबी केस स्टेटमेंट लिख सकता हूं। हालांकि, मैं अपने रिटर्न स्टेटमेंट में मिलान डेटा का उपयोग करना चाहता हूं। इस अर्ध-छद्म कोड की तरह कुछ:रेगेक्स और बैकरेरेंस के साथ रूबी स्विच स्टेटमेंट (केस ... कब) लिखना है?

foo = "10/10/2011" 

case foo 
    when /^([0-9][0-9])/ 
     print "the month is #{match[1]}" 
    else 
     print "something else" 
end 

मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद!


बस एक ध्यान दें: मैं समझता हूँ कि मैं कभी के रूप में ऊपर एक सरल मामले के लिए एक स्विच बयान का उपयोग नहीं होगा, लेकिन यह है कि केवल एक उदाहरण है। हकीकत में, जो मैं हासिल करने की कोशिश कर रहा हूं वह एक तारीख के लिए कई संभावित नियमित अभिव्यक्तियों का मिलान है जो विभिन्न तरीकों से लिखा जा सकता है, और उसके बाद रूबी की तिथि श्रेणी के साथ इसे पार्स कर रहा है।

+0

रुबी की तिथि .parse कई दिनांक प्रारूपों को समझता है। या तुमने कोशिश की? – raine

+0

हालांकि यह इस प्रश्न का उत्तर नहीं देता है, हो सकता है कि आप क्रोनिक मणि को देखना चाहें ... – DGM

उत्तर

108

मेल खाने वाले समूह नवीनतम regex के लिए संदर्भ हमेशा pseudo variables$1 में जमा हो जाती $9 रहे हैं:

case foo 
when /^([0-9][0-9])/ 
    print "the month is #{$1}" 
else 
    print "something else" 
end 

तुम भी $LAST_MATCH_INFO छद्म चर का उपयोग कर सकते हैं पूरे MatchData वस्तु को प्राप्त करने के लिए। जब नामित कैप्चर का उपयोग कर यह उपयोगी हो सकता:

case foo 
when /^(?<number>[0-9][0-9])/ 
    print "the month is #{$LAST_MATCH_INFO['number']}" 
else 
    print "something else" 
end 
+0

... बस अच्छी तरह से किया गया और +1 :) – apneadiving

+0

तोडा, योसी - बिदियुक मा वह हिपास्ती। –

+0

@Yossi क्या आपके पास थ्रेड सुरक्षा के संबंध में आपकी टिप्पणी का स्रोत है? मैंने बस रूबी 1.8.7 में एक प्रयोग किया जो ऐसा लगता है कि यह थ्रेड-सुरक्षित है! (थ्रेड प्रत्येक एक सेकेंड से रेगेक्स से मेल खाता है - यदि स्थानीय मैचों को गिरफ्तार किया जा रहा है तो irb में जांच कर रहा है) – Joel

4

यहाँ एक वैकल्पिक दृष्टिकोण है कि आप एक ही परिणाम हो जाता है लेकिन एक स्विच का उपयोग नहीं करता है। आप एक सरणी में अपने रेगुलर एक्सप्रेशन डाल, तो आप इस तरह कुछ कर सकता है:

res = [ /pat1/, /pat2/, ... ] 
m = nil 
res.find { |re| m = foo.match(re) } 
# Do what you will with `m` now. 

घोषणा m ब्लॉक के बाहर होने के बाद find ब्लॉक के साथ किया जाता है और find जैसे ही बंद हो जाएगा यह अभी भी उपलब्ध होने की अनुमति देता है ब्लॉक एक वास्तविक मूल्य देता है ताकि आपको वही शॉर्टकटिंग व्यवहार मिल सके जो एक स्विच आपको देता है। यदि आपको इसकी आवश्यकता है तो यह आपको पूर्ण MatchData देता है (शायद आप अपने रेगेक्स में नामित कैप्चर समूह का उपयोग करना चाहते हैं) और अपने रेगेक्स को अपने खोज तर्क से अलग करता है (जो स्पष्ट कोड उत्पन्न कर सकता है या नहीं), आप अपने रेगेक्स को भी लोड कर सकते हैं एक कॉन्फ़िगरेशन फ़ाइल या चुनें कि आप किस सेट को रन टाइम पर चाहते थे।

+0

भी काम करता है मैं 'केस' दृष्टिकोण का उपयोग करके थ्रेड सुरक्षा के बारे में भी सोच रहा था। हो सकता है कि आप केस दृष्टिकोण (?) के साथ वैश्विक चर के बजाय, थ्रेडेड परिदृश्य में एमयू के दृष्टिकोण का उपयोग करना चाहते हैं – Casper

संबंधित मुद्दे