我有一个类似的数组:
["Rob Meyer", "Michelle Preston"]
我想搜索rob or Rob, or meyer or Meyer
等的出现,数组中的任何“单词”,没有字符,只有单词而不区分大小写。
那我该怎么做? include?
寻找完全匹配。我在这里寻找更灵活的东西。
答案 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'