数据库中项目之间的顺序或特殊性是在将它们与字符串匹配之前确定的。你没有在问题中说清楚,但我想你想到的是长度。因此,假设您将数据作为哈希:
h = {
item1: "pork with apple sauce",
item2: "pork",
item3: "apple sauce",
}
然后,您可以按标签的长度对其进行排序,以便较长的标签出现在列表中。同时,您可以将标签转换为正则表达式,这样您就无需担心空间的变化。然后,您将有一个这样的数组:
a =
h
.sort_by{|_, s| s.length}.reverse
.map{|k, s| [k, Regexp.new("\\b#{s.gsub(/\s+/, '\\s+')}\\b")]}
# =>
# [
# [
# :item1,
# /\bpork\s+with\s+apple\s+sauce\b/
# ],
# [
# :item3,
# /\bapple\s+sauce\b/
# ],
# [
# :item2,
# /\bpork\b/
# ]
# ]
一旦你有了这个,你只需要在列表中找到与字符串匹配的第一个项目。
s = "Today I would like to eat pork with apple sauce, it would fill me up"
a.find{|_, r| s =~ r}[0]
# => :item1