字符串包含另一个字符串或正则表达式(红宝石)
问题描述:
我需要检查给定的字符串是否包含字符串或正则表达式。如果是,它应该返回true,否则 - false。我该怎么做?字符串包含另一个字符串或正则表达式(红宝石)
我:
def method(string)
if @text.match(/#{string}/)
true
else
false
end
end
但我不知道这是否是一个正确的方法。
答
考虑一下:
@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/
Stack Overflow是不一个“为我写代码”的网站。相反,我们帮助您解决您编写的代码问题。请向我们展示您尝试过的内容,解释为什么它没有做到您想要的,我们很乐意为您提供帮助。 – 2014-11-03 20:06:32
您可以在[ruby-doc](http://www.ruby-doc.org/core-2.1.4/String.html) – 2014-11-03 20:17:48
中轻松找到您的答案。我已更新我的帖子。 – user3014317 2014-11-03 20:46:31