2013-05-15 95 views
0

我想檢查包含一個或多個匹配字符串的字符串數組。紅寶石字符串 - 檢查一組字符串匹配

目前我正在通過使用if語句來做到這一點 - 不好,但它的工作原理 - 但現在我正在尋找更類似Ruby的方式來做到這一點。

row[:datapoints].each do |data|    
    if data[:direction].include? "Beusselstr" 
     data[:image] = "category-1" 
    end  
    if data[:direction].include? "Ostkreuz" 
     data[:image] = "category-1" 
    end       
    if data[:direction].include? "Westend" 
     data[:image] = "category-2" 
    end 
    if data[:direction].include? "1)S Gr" 
     data[:image] = "category-3"    
    end 
end 

取而代之,我想將匹配的字符串存儲在數組中。爲了讓它更復雜一點,我實際上有不同類別的匹配項與他們自己的結果操作(請參閱數據[:image]值的類別特定分配)。

category_1_keywords = ["Beusselstr","Ostkreuz"] 
category_2_keywords = ["nefeld Bhf","Greifswalder","Westend"] 
category_3_keywords = ["1)S Gr"] 

imagecategories = {:category_1 => category_1_keywords,:category_2 => category_2_keywords,:category_3 => category_3_keywords} 

如何將過濾該陣列:使用這樣的匹配陣列(imagecategories)看起來像(行[數據點])?

+0

最後一部分不清晰,比如'category_1_keywords','category_2_keywords'等。 –

+0

基本上我想使用包含具有類別特定關鍵字/匹配項(類別_..._關鍵字)的數組的數組(imagecategories)。我是Ruby的初學者。也許有更好的方法來構建包含術語和類別的搜索對象結構。 – Bernd

+0

你最終的目標是什麼,舉一些例子。 –

回答

1

您可能想要使用數組相交運算符&並檢查它是否爲空。

if (data[:direction] & category_1_keywords).any? 
    data[:image] = "category-1" 
end 

4,如果在一排,雖然開始像時間的迭代器:

keywords = { 
'category_1' => ["Beusselstr","Ostkreuz"], 
'category_2' => ["nefeld Bhf","Greifswalder","Westend"], 
'category_3' => ["1)S Gr"] 
} 

data[:image] = keywords.find{|k,v| (data[:direction] & v).any?}[0] 
+0

謝謝。看起來像正確的方向。但是,如果匹配字符串只是字符串的一部分,字符串也應該匹配。不一定完全匹配。我應該提到這一點。 – Bernd

0

假設data[:direction]是一個字符串,你可以找到與該類別:

data[:image], _ = imagecategories.find { |category, keywords| 
    keywords.any? { |keyword| 
    data[:direction].include?(keyword) 
    } 
} 

在純文本:找到data[:direction]字符串包含的任何關鍵字(keywords.any?)的第一個類別關鍵字對(imagecategories.find)。