2011-12-20 70 views
6

Me gustaría componer expresiones regulares, que es reutilizar una expresión regular en una nueva expresión regular.¿Composición de expresiones regulares?

¿Es posible en Ruby?

Por ejemplo, con el fin de simplificar este montaje como el análisis sintáctico:

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

me gustaría recurrir a:

IMMEDIATE = /(movi|addi)/ 

Pero entonces yo no sé cómo cuota de esta expresión regular en los dos anteriores.

¿Alguna pista?

Respuesta

17

Claro, las expresiones regulares se pueden reutilizar (o componer) dentro de otras expresiones regulares. Aquí hay un ejemplo que combina dos expresiones regulares para hacer un tercero:

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

Su ejemplo es bastante similar. En este caso, sería:

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

También puede utilizar cadenas:

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

aviso que debe escapar de las barras invertidas.