我有一个类似的字符串:"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.
我不知道如何更好地描述我的问题,我希望你从提供的例子中了解它。
答案 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使其不区分大小写。