繁体   English   中英

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

[英]String includes another string or regex (Ruby)

我需要检查给定的String是否包含字符串或正则表达式。 如果是这样,则应返回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

String的[]方法允许我们传入字符串或模式。 如果是字符串,则该方法将其用于固定字符串/字符串内搜索。 如果传入模式,则返回匹配的文本。

但是,Ruby比这更友好。 我们不必告诉它有条件地返回true或false值。 在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/

单行代码:

!@text.match(/#{string}/).nil?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM