如何在具有不同组合的数组中的字符串中搜索单词?

时间:2013-05-02 12:43:48

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个类似的数组:

["Rob Meyer", "Michelle Preston"]

我想搜索rob or Rob, or meyer or Meyer等的出现,数组中的任何“单词”,没有字符,只有单词而不区分大小写。

那我该怎么做? include?寻找完全匹配。我在这里寻找更灵活的东西。

4 个答案:

答案 0 :(得分:2)

这就是你要找的东西吗?

query = 'rob'
["Rob Meyer", "Michelle Preston"].any?{|e| e =~ /\b#{query}\b/i}

答案 1 :(得分:1)

预编译单词列表。

words = ["Rob Meyer", "Michelle Preston"].flat_map{|s| s.downcase.scan(/\w+/)}

words.include?("Rob".downcase) # => true

答案 2 :(得分:0)

看起来好像在寻找匹配操作。 Ruby允许您使用正则表达式(正则表达式)。

阅读 match()方法,我相信您会找到所需内容。

在Ruby中使用正则表达式时,使用“/ i”表达式将使其不区分大小写。

我经常去http://ruby-doc.org/找到Ruby语言细节。

祝你好运!

答案 3 :(得分:0)

我经常这样做:

names = ["Rob Meyer", "Michelle Preston"]

targets = %w[rob meyer]
regex = /\b(?:#{ Regexp.union(targets).source })\b/i
# => /\b(?:rob|meyer)\b/i

names.select{ |name| name[regex] }

返回命中的名称数组:

[
    [0] "Rob Meyer"
]

我使用Regexp.union的原因是获取大量可能的目标,立即创建搜索它们的模式,然后搜索数兆字节的文本进行点击,这些都以正则表达式的速度运行是微不足道的引擎,没有迭代。它与我们在Ruby中搜索的速度一样快。

name[regex]是生成真/假值的基础。将其更改为!!name[regex]将返回布尔值true / false值。

不是将其嵌入select中,而是用点击来抓取名称,而是可以在带有条件的循环中完成:

names.each do |name|
  if name[regex]
    puts "got a hit for '#{ name }'"
  end
end

哪个输出:

got a hit for 'Rob Meyer'