2011-04-07 8 views
7
ruby-1.9.2-p180 :003 > result = "test string".match(/(?<mtch>test)/) 
=> #<MatchData "test" mtch:"test"> 
ruby-1.9.2-p180 :011 > result["mtch"] 
=> "test" 
ruby-1.9.2-p180 :012 > result["fail"] 
IndexError: undefined group name reference: fail 
    from (irb):12:in `[]' 
    from (irb):12 
    from /Users/jeremysmith/.rvm/rubies/ruby-1.9.2-p180/bin/irb:16:in `<main>' 

कोई नामांकित समूह मौजूद है या नहीं, यह जांचने के लिए कोई मिलानडेटा फ़ंक्शन नहीं है। क्या जांचने का कोई और तरीका है?मैं कैसे जांचूं कि नामित समूह किसी मिलानडेट ऑब्जेक्ट में मौजूद है या नहीं?

उत्तर

15
result.names.include? 'mtch' 
# => true 
result.names.include? 'fail' 
# => false 
0
result["fail"] rescue false 

एक आसान तरीका है। अधिक सुरुचिपूर्ण तरीके हैं, लेकिन बचाव संशोधक अक्सर आसान होता है, यह आसान है अगर आप अपवादों पर ध्यान देना नहीं चाहते हैं।

+0

क्या यह बुरा अभ्यास माना जाता है? –

+0

निर्भर करता है। कभी-कभी आप वास्तव में परवाह नहीं करते हैं कि अपवाद में था (जैसे कि जब आप जानते हैं कि मैच नहीं होने का कारण बनता है)। मैं इसे कम से कम उपयोग करता हूं, लेकिन मुझे इसे खराब शैली नहीं माना जाता है। – EdvardM

+0

लेकिन परिणाम.names.include का उपयोग कर? बेहतर है, आईएमओ, जैसे मैलाडन ने सुझाव दिया। – EdvardM

0

p का उपयोग कर मिलान किए गए डेटा का निरीक्षण करें। आपके मामले में, उदाहरण पहले से दिखाता है कि आपके पास क्या है।

=> #<MatchData "test" mtch:"test"> 

इसका मतलब है कि पूरी स्ट्रिंग से मेल खाने वाला "test" है, और नाम की सूची है (केवल) mtch। अगर इसका कोई अन्य नाम था, तो इसे इस रूप में शामिल किया जाएगा।

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

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