数组

时间:2015-10-16 15:31:11

标签: arrays ruby regex

我有一个类似的字符串:"Men's Beech River Cable T-Shirt"如何从此字符串中获取类别?

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.

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

3 个答案:

答案 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 :(得分: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

遍历每个类别,并查找该类别是否包含该字符串所具有的单词。

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

答案 2 :(得分: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中存在任何这些单词,则返回将是匹配的单词,否则返回nil。

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