2017-02-28 4 views
-1

Ich habe ein Array, das übereinstimmende Werte enthalten sollte, wie unten zu sehen ist.Ruby - Regulärer Ausdruck für passende Paare

gemstone = ["ruby", "red"] 

ich einen regulären Ausdruck verwenden keine unmöglich Kombinationen zu verwerfen, wie zum Beispiel:

Rubin blau
Saphir grün
Smaragd rot

Nun, Sie bekommen die Idee. Ich verwende den folgenden regulären Ausdruck, um nach Kombinationen zu suchen, aber dies führt zu einem falschen Ergebnis.

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

Wenn ein Edelstein seine richtige Farbe haben nicht, würde ich es verwerfen möchte, aber es wirft auch richtige Kombinationen, wie zum Beispiel:

saphirblau
grüne Smaragd

Wie würde ich nur die richtigen Kombinationen finden?

+1

Eine Struktur wie '{ruby:% w [rot], Diamant:% w [clear blue yellow]}' wäre hier mit * viel * einfacher zu bearbeiten. – tadman

+0

Überprüfen Sie http://rubular.com, um Ihre Regex zu testen –

+0

Wie binden Sie die RE an das Array? – cdarke

Antwort

0

Ein Regex muss mit einem String arbeiten, nicht mit einem Array, also könnte gemstone.join(' ') funktionieren. Nicht, dass ich das empfehlen würde. Ich würde so etwas adaman vorgeschlagen:

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) 

Dies setzt voraus, dass Edelsteine ​​mehrere Farben sein könnten. Sie könnten es ein wenig vereinfachen, wenn jeder Edelstein nur eine Farbe hätte.

Hinweis: Ich würde kein Array verwenden, um einen Edelstein darzustellen. Ich würde empfehlen, es in eine Klasse zu verwandeln, oder zumindest mit einem Hash.