2010-04-15 13 views
6

तो यह क्यों काम नहीं कर रहा है? मैं एक रेगेक्स बना रहा हूं जो एक सूत्र से मेल खाएगा (जो तब एक बड़े मानक वर्णन का हिस्सा है)। लेकिन मैं यहां फंस गया हूं, क्योंकि ऐसा लगता है कि यह सूत्र के भीतर एम्बेडेड सूत्रों से मेल नहीं खाता है।रूबी रिकर्सिव रेगेक्स

stat  = /(Stat3|Stat2|Stat1)/ 

number_sym = /[0-9]*/ 
formula_sym = /((target's)?#{stat}|#{number_sym}|N#{number_sym})\%?/ 
math_sym = /(\+|\-|\*|\/|\%)/ 

formula  = /^\((#{formula}|#{formula_sym})(#{math_sym} (#{formula}|#{formula_sym}))?\)$/ 

p "(target's Stat2 * N1%)".match(formula).to_s #matches 
p "((target's Stat2 * N1%) + 3)".match(formula).to_s #no match 
p "(Stat1 + ((target's Stat2 * N1%) + 3))".match(formula).to_s #no match 

उत्तर

7

आप #{ } वाक्य रचना का उपयोग करते हैं, रूबी एक स्ट्रिंग to_s का उपयोग करने के RegExp ऑब्जेक्ट बदल देता है। देखो क्या होता है जब आप एक स्ट्रिंग के लिए एक RegExp ऑब्जेक्ट परिवर्तित:

irb> re.source 
"blah" 

तो करने के लिए:

irb> re = /blah/ 
    => /blah/ 
irb> re.to_s 
    => "(?-mix:blah)" 
irb> "my regex: #{re}" 
    => "my regex: (?-mix:blah)" 
irb> /my regex: #{re}/ 
    => /my regex: (?-mix:blah)/ 

स्ट्रिंग आप चाहते प्राप्त करने के लिए (मेरे उदाहरण में, "blah"), Regexp#source विधि का उपयोग अपने उदाहरण का उपयोग करें: formula की अपनी परिभाषा में #{formula} रों रिक्त स्ट्रिंग में बदला जाता है:

formula_sym = /((target's)?#{stat.source}|#{number_sym.source}|N#{number_sym.source})\%?/ 
+0

धन्यवाद ... और मुझे पता चला कि यह क्यों काम नहीं कर रहा था ... अनुमान है कि मुझे अपने प्रश्न का अनुवाद करना चाहिए था कि "मैं इसे कैसे काम कर सकता हूं" .... ऐसा लगता है कि # {formula.source} ने दिखाया है कि सूत्र अभी भी शून्य था। –

1

आप उस तरह प्रत्यावर्तन का उपयोग नहीं कर सकते हैं। आप जो चाहते हैं वह नियमित अभिव्यक्ति की क्षमता से परे है - नियमित अभिव्यक्तियां नेस्टेड कोष्ठक से भी मेल नहीं खाती हैं। मुझे संदेह है कि आप जो चाहते हैं उसे करने के लिए आपको एक वास्तविक पार्सर की आवश्यकता होगी। उदाहरण के लिए treetop देखें।

+0

उत्कृष्ट ... treetop मुझे आसानी से मेरी वर्तमान परिभाषा spec माइग्रेट करने की अनुमति देगा। धन्यवाद! –

3
/(
    (?<non_grouping_char> 
    [^\(\{\[\<\)\}\]\>] 
){0} 
    (?<parens_group> 
    \(\g<content> \) 
){0} 
    (?<brackets_group> 
    \[ \g<content> \] 
){0} 
    (?<chevrons_group> 
    \< \g<content> \> 
){0} 
    (?<braces_group> 
    \{ \g<content> \} 
){0} 
    (?<balanced_group> 
    (?> 
     \g<parens_group> | 
     \g<brackets_group> | 
     \g<chevrons_group> | 
     \g<braces_group> 
    ) 
){0} 
    (?<content> 
    (?> \g<balanced_group> | \g<non_grouping_char>)* 
){0} 
    \A \g<content> \Z 
)/uix 

यदि यह आपकी मदद करता है तो मुझे सहन करें। मेरे लिये कार्य करता है। किसी भी regexp इंजन में काम करता है जो नामित समूहों की अनुमति देता है। यह किसी भी सामग्री को मान्य करेगा जिसमें कोई समूह नहीं है, या किसी भी गहराई के लिए घोंसले के पात्रों के समूह हैं।

+1

अगर हम मिलते हैं, तो सुनिश्चित करें कि मैं आपको एक बियर का भुगतान करूंगा। आपका पसंदीदा स्वाद क्या है? :) तब से, मैं वोट देता हूं! – Stephan

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