2013-05-02 74 views

回答

2

这是你在找什么?

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

是的,但我想它返回true或false。谢谢。 – psharma 2013-05-02 12:48:27

+0

相应地更新了我的回答 – MoMolog 2013-05-02 12:52:00

+1

当数组为'[“robber”]且搜索字符串为“Rob”时,这将返回true。 – sawa 2013-05-02 12:53:23

1

预编译单词列表。

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

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

这工作很顺利。谢谢:) – psharma 2013-05-02 13:13:30

+1

这很好!你可以通过将第一个地图移动到第一个地图来简化它:[“Rob Meyer”,“Michelle Preston”] .flat_map {| s | s.downcase.scan(/ \ w + /)} – MoMolog 2013-05-02 14:57:06

+0

是的,我应该这样做。谢谢你的提示。 – sawa 2013-05-02 14:58:49

0

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

阅读匹配()方法,我相信你会找到你需要的。

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

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

祝你好运!

+0

'match'是一种矫枉过正的情况,当你只需要一个布尔值时,它比'=〜'慢。 – sawa 2013-05-02 12:55:30

+0

匹配和=〜是相同的方法,据我所知https://github.com/ruby/ruby/blob/trunk/string.c#L8622 – 2013-05-02 13:03:51

+0

他们不是。 '=〜'在匹配时返回位置,'match'返回一个'MatchData'。 – sawa 2013-05-02 13:15:17

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' 
相关问题