2015-10-16 143 views
1

我有一个这样的字符串:"Men's Beech River Cable T-Shirt"如何从此字符串获取类别?数组中的Ruby匹配字符串

str = "Men's Beech River Cable T-Shirt" 
str2 = "MEN'S GOOSE EYE MOUNTAIN DOWN VEST" 
cat1 = str1.split.last # T-Shirt 
cat2 = str2.split.last # VEST 

TOPS = %w(jacket vest coat blazer parka sweater shirt polo t-shirt) 

期望的结果:

category_str1 = "Tops" # Since T-Shirt (shirt) is in TOPS constant. 
category_str2 = "Tops" # Since vest is in TOPS const. 

我不知道如何更好地描述我的问题,我希望你从示例中提供的理解。

+0

'TOPS'有'衬衫'而不是'T恤',这两个都应该在'TOPS'中吗? – Anthony

+0

更新,但即使部分字符串匹配 - 它应该设置类别顶部 –

回答

3
str = "Men's Beech River Cable T-Shirt" 
cat_orig = str.split.last # T-Shirt 

TOPS = %w(jacket vest coat blazer parka sweater shirt polo) 
RE_TOPS = Regexp.union(TOPS) 
category = "Tops" if RE_TOPS =~ cat_orig.downcase 

请注意,在%w()样式的数组语法中没有逗号。

+1

我喜欢这个,你也可以用'union = Regexp.union(TOPS)'; 'pattern = Regexp.new(union.source,Regexp :: IGNORECASE)'而不是向下包装字符串。 – Anthony

1

做到这一点的最好方法是通过散列而不是数组。比方说,你caetgories是这个样子

categories = { "TOPS" => ["shirt", "coat", "blazer"], 
       "COOKING" => ["knife", "fork", "pan"] } 

然后,我们可以遍历每个类别和发现,如果它们的值包含字符串

categories.each do |key, value|  
    puts key if str.downcase.split(' ').any? { |word| categories[key].include?(word) } 
end 

循环每一个类别中的字,并发现如果类别有一个字,该字符串。

注意:这还没有搜索子字符串。

+0

不错,但是我应该怎么做str.split.downcase.any? –

1
str = "Men's Beech River Cable T-Shirt" 
cat_orig = str.split.last # T-Shirt 

TOPS = %w(jacket vest coat blazer parka sweater shirt polo) # suppressed the comma to get a clean array 

category = "Tops" if !cat_orig[/(#{TOPS.join("|")})/i].nil? 

在TOPS阵列的加入建立形式的备选的正则表达式:

(jacket|vest|coat|blazer|parka|sweater|shirt|polo) 

如果任何这些字的存在于cat_orig,返回将是相匹配的字,如果没有它会返回零。

请注意正则表达式中的前导i,以使其不区分大小写。