【问题标题】:Ruby match string in array数组中的 Ruby 匹配字符串
【发布时间】:2016-01-15 10:18:18
【问题描述】:

我有一个这样的字符串:"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.

我不知道如何更好地描述我的问题,希望您通过提供的示例理解它。

【问题讨论】:

  • TOPS 有一个shirt 而不是t-shirt,它们都应该在TOPS 中吗?
  • 已更新,但即使部分字符串匹配 - 它也应将类别设置为 Tops

标签: arrays ruby regex


【解决方案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)
RE_TOPS = Regexp.union(TOPS)
category = "Tops" if RE_TOPS =~ cat_orig.downcase

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

【讨论】:

  • 我喜欢这个,你也可以用union = Regexp.union(TOPS); pattern = Regexp.new(union.source, Regexp::IGNORECASE) 而不是向下套管字符串。
【解决方案2】:
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 Array 上的连接构建了一个替代正则表达式,形式如下:

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

如果这些单词中的任何一个出现在 cat_orig 中,则返回匹配的单词,否则返回 nil。

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

【讨论】:

    【解决方案3】:

    最好的方法是通过散列,而不是数组。假设您的类别看起来像这样

    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
    

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

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

    【讨论】:

    • 不错,但是我应该如何处理 str.split.downcase.any?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2014-03-15
    • 2020-06-08
    相关资源
    最近更新 更多