字符串包括另一个字符串或正则表达式(Ruby)

时间:2014-11-03 20:00:55

标签: ruby

我需要检查给定的String是否包含字符串或正则表达式。如果是,则应返回true,否则为false。我该怎么办?

我有:

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

但我不确定这是否正确。

2 个答案:

答案 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?