2011-12-20 13 views
6

मैं रेगेक्सप्स लिखना चाहता हूं, जो एक नए रेगेक्स में रेगेक्स का पुन: उपयोग कर रहा है।regexp लिखना?

क्या रूबी में यह संभव है?

उदाहरण के लिए, आदेश में इस विधानसभा की तरह पार्स सरल बनाने के लिए:

LABELED_INSTR = /(\w+):(movi|addi)\s+(\w+),(\w+),(w+)/ 
NON_LABELED_INSTR = /(movi|addi)\s+(\w+),(\w+),(w+)/ 

मैं का सहारा लेना चाहते हैं:

IMMEDIATE = /(movi|addi)/ 

लेकिन तब मैं नहीं जानता कि कैसे शेयर दो पिछले लोगों में यह regex।

कोई संकेत?

उत्तर

17

निश्चित रूप से, नियमित अभिव्यक्तियों को अन्य regexes के भीतर पुन: उपयोग (या रचना) किया जा सकता है। यहां एक उदाहरण दिया गया है जो दो रेगेक्स को तीसरा बनाने के लिए जोड़ता है:

>> a = /boo/ 
=> boo 
>> b = /foo/ 
=> foo 
>> c = /#{a}|#{b}/ 
=> -mix:boo-mix:foo 
>> if "boo" =~ c 
>> puts "match!" 
>> end 
match! 
=> nil 

आपका उदाहरण बहुत समान है। यहाँ, यह होगा:

IMMEDIATE = /(movi|addi)/ 
LABELED_INSTR = /(\w+):#{IMMEDIATE}\s+(\w+),(\w+),(w+)/ 
NON_LABELED_INSTR = /#{IMMEDIATE}\s+(\w+),(\w+),(w+)/ 
0

तुम भी तार का उपयोग कर सकते हैं:

IMMEDIATE = "(movi)|(addi)" 
LABELED_INSTR = Regexp.new("(\\w+):#{IMMEDIATE}\\s+(\\w+),(\\w+),(w+)/") 
NON_LABELED_INSTR = Regexp.new(IMMEDIATE + "\\s+(\\w+),(\\w+),(w+)/") 

नोटिस आप उल्टे स्लैश पलायन करना होगा।