2013-05-02 66 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'