2013-05-15 94 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)。