2011-12-20 3 views
6

Я хотел бы создать регулярные выражения, то есть повторно использовать регулярное выражение в новом регулярном выражении.Составление регулярного выражения?

Возможно ли это в Ruby?

Например, для того, чтобы упростить эту сборку, как синтаксический анализ:

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

Я хотел бы обратиться к:

IMMEDIATE = /(movi|addi)/ 

Но тогда я не знаю, как доля это регулярное выражение в двух предыдущих.

Подсказка?

ответ

17

Конечно, регулярные выражения могут быть повторно использованы (или составлены) в пределах других регулярных выражений. Вот пример, который объединяет два регулярных выражения, чтобы сделать третью:

>> 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+)/") 

уведомления вы должны бежать перевернутый слэш.

Смежные вопросы