2011-12-20 27 views
6

Tôi muốn soạn regexps, đang sử dụng regex trong một regex mới.Soạn regexp?

Điều đó có thể thực hiện được trong Ruby không?

Ví dụ, để đơn giản hóa lắp ráp giống như phân tích cú pháp này:

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

Tôi muốn dùng đến:

IMMEDIATE = /(movi|addi)/ 

Nhưng sau đó tôi không biết làm thế nào để phần regex này trong hai lần trước.

Bất kỳ gợi ý nào?

Trả lời

17

Chắc chắn, biểu thức chính quy có thể được sử dụng lại (hoặc được soạn thảo) trong các regex khác. Dưới đây là ví dụ kết hợp hai regex để tạo thứ ba:

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

Ví dụ của bạn khá giống nhau. Ở đây, nó sẽ là:

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

Bạn cũng có thể sử dụng chuỗi:

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

thông báo bạn phải thoát khỏi dấu gạch chéo ngược.