2014-11-03 216 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/ 
相关问题