2011-12-20 11 views
6

Chciałbym skompilować wyrażenie regularne, czyli ponowne użycie wyrażenia regularnego w nowym wyrażeniu regularnym.Komponowanie regexp?

Czy to możliwe w Ruby?

Na przykład, w celu uproszczenia tego zgromadzenia, jak parsowanie:

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

chciałbym uciekać się do:

IMMEDIATE = /(movi|addi)/ 

Ale nie wiem jak akcji to wyrażenie regularne w dwóch poprzednich.

Dowolna podpowiedź?

Odpowiedz

17

Oczywiście wyrażenia regularne mogą być ponownie użyte (lub złożone) w ramach innych wyrażeń regularnych. Oto przykład, który łączy dwa wyrażenia regularne, aby uzyskać trzeci:

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

Twój przykład jest bardzo podobny. Tutaj byłoby:

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

Można również użyć ciągi:

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

zawiadomienie musi uciec odwrócone ukośniki.