2017-02-28 97 views
-1

我有一個應該包含匹配值的數組,如下所示。Ruby - 匹配對的正則表達式

gemstone = ["ruby", "red"] 

我使用正則表達式來丟棄任何不可能的組合,如:

紅寶石藍色
藍寶石綠色
翡翠紅

好了,你的想法。我正在使用以下正則表達式來匹配組合,但不知何故,這會返回錯誤的結果。

(?=.*ruby)(?=.*red).*|(?=.*emerald)(?=.*green).*|(?=.*sapphire)(?=.*blue).* 

如果寶石不具備其應有的顏色,我想放棄它,但它也放棄正確的組合,如:

寶石藍
翠綠色

我將如何去匹配適當的組合?

+1

像'{ruby:%w [red],diamond:%w [clear blue yellow}}'這樣的結構將會很容易在這裏使用。 – tadman

+0

查看http://rubular.com來測試你的正則表達式 –

+0

你如何將RE綁定到數組? – cdarke

回答

0

正則表達式需要對字符串操作而不是數組,因此可以這樣做gemstone.join(' ')。不是我會推薦。我會等什麼adaman建議:

ALLOWED_COLORS = { 
    'ruby'  => %w[ red ], 
    'diamond' => %w[ clear blue yellow ], 
    'sapphire' => %w[ blue ], 
    'emerald' => %w[ green] 
} 

color_set = ALLOWED_COLORS[ gemstone.first ] 
return color_set && color_set.include?(gemstone.second) 

這假定寶石可能是多種顏色。如果每顆寶石只有一種顏色,你可以簡化一下。

注意:我不會使用數組來表示寶石。我強烈建議把它轉換成一個類,或者至少使用一個散列。