我需要检查给定的String是否包含字符串或正则表达式。如果是,则应返回true,否则为false。我该怎么办?
我有:
def method(string)
if @text.match(/#{string}/)
true
else
false
end
end
但我不确定这是否正确。
答案 0 :(得分: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
String的[]
方法允许我们传入字符串或模式。如果它是一个字符串,则该方法将其用于固定字符串/字符串搜索。如果传入模式,则返回匹配的文本。
然而,Ruby比这更友好。我们不必告诉它有条件地返回真值或假值。在Ruby中,nil或false
值被视为false,其他任何东西都是“truethy”。我们可以使用!!
将值转换为true / false,这是双布尔“not”:
true # => true
'foo' # => "foo"
false # => false
nil # => nil
!true # => false
!'foo' # => false
!false # => true
!nil # => true
!!true # => true
!!'foo' # => true
!!false # => false
!!nil # => false
知道了,如果找不到,那么String的[]
会返回nil,如果找到则返回匹配的文本:
'foo'['foo'] # => "foo"
'foo'['bar'] # => nil
我们可以将原始方法缩减为:
def method3(string_or_regex)
!!@text[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/
答案 1 :(得分:0)
单行代码:
!@text.match(/#{string}/).nil?