2015-10-16 4 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' имеет' рубашку', а не 'футболку', должны ли они быть в« TOPS »? – Anthony

+0

Обновлено, но даже если часть совпадений строк - она ​​должна установить категорию для Tops –

ответ

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 

Loop через каждую категорию, и найти, если категория имеет слово, которое имеет строка.

Примечание: Это еще не поиск подстрок.

+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, возвращение будет соответствовать слово, если не получится return nil.

Обратите внимание, что ведущее i в регулярном выражении делает регистр нечувствительным.

Смежные вопросы