2017-02-28 60 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) 

这假定宝石可能是多种颜色。如果每颗宝石只有一种颜色,你可以简化一下。

注意:我不会使用数组来表示宝石。我强烈建议把它转换成一个类,或者至少使用一个散列。