2011-12-20 6 views
6

Je voudrais composer des regexps, c'est-à-dire réutiliser une regex dans une nouvelle regex.Composer une expression rationnelle?

Est-ce possible dans Ruby?

Par exemple, afin de simplifier cette analyse comme l'assemblage:

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

je voudrais recourir à:

IMMEDIATE = /(movi|addi)/ 

Mais je ne sais pas comment part cette regex dans les deux précédents.

Un conseil?

Répondre

17

Bien sûr, les expressions régulières peuvent être réutilisées (ou composées) dans d'autres regex. Voici un exemple qui combine deux regexes pour en faire un troisième:

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

Votre exemple est assez similaire. Ici, ce serait:

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

Vous pouvez également utiliser des chaînes:

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

avis vous devez échapper aux barres obliques inversées.

Questions connexes