2011-12-20 20 views
6

Vorrei comporre espressioni regolari, ovvero riutilizzare un'espressione regolare in una nuova espressione regolare.Composizione regexp?

È possibile in Ruby?

Per esempio, al fine di semplificare questa assemblea simile analisi:

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

Vorrei ricorrere a:

IMMEDIATE = /(movi|addi)/ 

Ma poi non so come quota questo regex nei due precedenti.

Qualche suggerimento?

risposta

17

Certo, le espressioni regolari possono essere riutilizzate (o composte) all'interno di altre regex. Ecco un esempio che combina due regex per creare un terzo:

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

Il tuo esempio è molto simile. Qui, sarebbe:

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

È inoltre possibile utilizzare le stringhe:

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

avviso si deve fuggire le barre invertiti.