2011-12-20 15 views
6

私はregexpsを作成したいと思います。つまり、新しい正規表現でregexを再利用しています。正規表現の作成?

Rubyでも可能ですか?例えば

は、このアセンブリのような解析を簡単にするために:

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

私はに頼るしたいと思います:

IMMEDIATE = /(movi|addi)/ 

しかし、私は知らないどのようにシェアこの正規表現は前の2つの正規表現に含まれています。

ヒント?

答えて

17

確かに、正規表現は他の正規表現内で再利用(または合成)できます。ここで第三作るために2つの正規表現を組み合わせた例を示します。

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

通知はあなたが逆スラッシュをエスケープする必要があります。