如何在字符串中查找关键字

时间:2014-02-04 11:02:40

标签: ruby-on-rails ruby

用户发送必须包含关键字的微笑。然后,此关键字用于查找商家。

该指令是在句子的开头使用关键字。

我知道有些用户不会在开头使用该关键字,或者会在关键字中添加标签(#@ - )或标点符号(keyword。)。

查找此关键字和业务的有效方法是什么?

我的尝试:

scrubbed_message = msg.gsub("\"", "").gsub("\'", "").gsub("#", "").gsub("-", "").gsub(",", "").gsub(".", "").gsub("@", "").split.join(" ")
tag = scrubbed_msg.split[0]
 if @business = Business.where(tag: tag).first
  log_message(@business)
 else
  scrubbed_msg.split.each do |w|
  if @business = Business.where(tag: w).first
   log_message(@business)
  end
 end
end

2 个答案:

答案 0 :(得分:1)

您可以使用Regexp匹配来过滤String中的所有不必要字符,然后使用#reduce git from splitted string中的Array方法获取第一个出现的问题标记字段与关键字匹配的记录,例如:关键字,tag1,tag2

msg = "key.w,ord tag-1'\n\"tag2"
# => "key.w,ord tag-1'\n\"tag2"
scrubbed = msg.gsub(/[#'"\-\.,@]/, "").split
# => ["keyword", "tag1", "tag2"]
@business = scrubbed.reduce(nil) do| sum, tag |
   sum || Business.where(tag: tag).first
end
# => Record tag: keyword
# => Record tag: tag1 if on record with keyword found

答案 1 :(得分:1)

我建议您使用白名单方法指定要保留哪些字符,例如字母数字字符,而不是要从字符串中删除哪些字符:

sms = "#keyword and the rest"
clean_sms = sms.scan(/[\p{Alnum}]+/)
# => ["keyword", "and", "the", "rest"]

然后,如果我做对了你想要做的事情,找到你正在寻找的事业你可以这样做:

first_existing_tag = clean_sms.find do |tag| 
  Business.exists?(tag: tag)
end

@business = Business.where(tag: first_existing_tag).first
log_message(@business)