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

これは、宝石は、複数の色可能性があることを前提としています。各宝石に色が1つしかない場合は、単純化することができます。

注:宝石を表すために配列を使用しません。私はそれをクラスに変換することを強く推奨します。あるいは、少なくともハッシュを使って変換することを強くお勧めします。

関連する問題