2015-10-16 200 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,以使其不區分大小寫。