2014-11-03 126 views
1

我需要檢查給定的字符串是否包含字符串或正則表達式。如果是,它應該返回true,否則 - false。我該怎麼做?字符串包含另一個字符串或正則表達式(紅寶石)

我:

def method(string) 
    if @text.match(/#{string}/) 
    true 
    else 
    false 
    end 
end 

但我不知道這是否是一個正確的方法。

+2

Stack Overflow是不一個「爲我寫代碼」的網站。相反,我們幫助您解決您編寫的代碼問題。請向我們展示您嘗試過的內容,解釋爲什麼它沒有做到您想要的,我們很樂意爲您提供幫助。 – 2014-11-03 20:06:32

+0

您可以在[ruby-doc](http://www.ruby-doc.org/core-2.1.4/String.html) – 2014-11-03 20:17:48

+0

中輕鬆找到您的答案。我已更新我的帖子。 – user3014317 2014-11-03 20:46:31

回答

4

考慮一下:

@text = 'foobar' 

def method1(string) 
    if @text.match(/#{string}/) 
    true 
    else 
    false 
    end 
end 

這可以簡化爲:

def method2(string_or_regex) 
    if @text[string_or_regex] 
    true 
    else 
    false 
    end 
end 

字符串的[]方法允許我們在一個字符串或圖案來傳遞。如果它是一個字符串,則該方法將其用於固定字符串/字符串內搜索。如果傳入一個模式,則返回匹配的文本。

但是,Ruby比這更友好。我們不必告訴它有條件地返回真實或錯誤的值。在Ruby中,nil或false值被視爲false,其他任何內容都是「真實」的。我們可以將值轉換爲真/假使用!!,這是雙布爾「不」:

true # => true 
'foo' # => "foo" 
false # => false 
nil # => nil 

!true # => false 
!'foo' # => false 
!false # => true 
!nil # => true 

!!true # => true 
!!'foo' # => true 
!!false # => false 
!!nil # => false 

知道了,而該字符串的[]返回一個零如果沒有找到,或者匹配的文本,如果發現:

'foo'['foo'] # => "foo" 
'foo'['bar'] # => nil 

我們可以減少原來的方法:

def method3(string_or_regex) 
    [email protected][string_or_regex] 
end 

這裏發生了什麼測試每個方法上面:

method1('foo') # => true 
method1('baz') # => false 

method2('foo') # => true 
method2(/foo/) # => true 
method2('baz') # => false 
method2(/baz/) # => false 

method3('foo') # => true 
method3(/foo/) # => true 
method3('baz') # => false 
method3(/baz/) # => false 

你必須要小心插正則表達式對象到另一個正則表達式:

string = /foo/ 
/#{string/ # => /(?-mix:foo)/ 

(?-mix:是插入內的其他圖案的圖案標誌,它可以打開你的模式,以古靈精怪的行爲並創建極其難以發現的錯誤。相反,我強烈建議您使用source方法,如果你要做到這一點,這將導致原有格局被插入:

/#{string.source}/ # => /foo/ 
相關問題