Ruby:布尔正则表达式方法的正确语法是什么?

检查模式的字符串的方法的正确语法是什么,如果正则表达式匹配,则返回true或false?

基本理念:

def has_regex?(string) pattern = /something/i return string =~ pattern end 

使用案例:

 if has_regex?("something") # woohoo else # nothing found: panic! end 

如果你想把模式放在一个方法中,你就可以这样做

 def has_my_pattern(st) st =~ /pattern/ end 

或者,或许更好,将模式放在类变量中?

在你提出的问题中:

…检查字符串中的模式的方法,如果正则表达式匹配则返回true或false

正如johannes所指出的,如果模式不匹配, String=~将返回nil ,否则匹配单词的字符串中的位置将返回nil 。 此外,他在Ruby中陈述除了nilfalse之外的所有内容都表现得 true 。 所有这一切都是正确的。

但是,它们并不完全 truefalse 。 因此,最后一步是将值强制为Boolean 。 这是通过将结果包装在双重刘海中来true

 def has_regex?(string) !!(string =~ /something/i) end 

你的代码看起来很好,但你可以写得更小。

String#=~的返回值以这种方式表现:

  • 如果模式不匹配则nil
  • 匹配单词开始的字符串中的位置

在Ruby中,除了nilfalse之外的所有内容在条件语句中都表现为true ,因此您可以编写

 if string=~ pattern # do something else # panic end 

要使其返回true / false,请切换模式和字符串的位置并使用大小写相等===

 def has_regex?(string) pattern = /something/i return pattern === string end 

我绝对需要它返回真正的布尔值并挖掘。 它实际上记录在regexp类中http://www.ruby-doc.org/core-2.1.3/Regexp.html#method-i-3D-3D-3D

如果您使用的是Ruby 2.4或更高版本,则会出现String#match?(regex)Regexp#match?(string)方法,这些方法返回没有转换shenanigans的booleans(通常不需要),并且具有更高的启动性能。

https://ruby-doc.org/core-2.4.0/Regexp.html#method-i-match-3F

https://blog.cognitohq.com/new-features-in-ruby-2-4/

对于Ruby> = 2.4或Rails,您可以:

  regexp.match?(string) 

将它添加到String类使得它使用起来非常简单:

  class String def match?(regex) !!self.match(regex) end end 

我将它添加到Rails初始化程序(RAILS_ROOT / config / initializers),您可以直接从字符串调用:

 "Something special!".match?(/something/i) #=> true "Somethin' special!".match?(/something/i) #=> false 

对于任何人的未来参考, bbatsov的ruby风格指南不赞成双重刘海。 而不是使用双重爆炸,只需检查值是否为零。 如果值不是nil,则存在。

而不是这样做:

 def has_regex?(string) !!(string =~ /something/i) end 

你总是可以这样做:

 def has_regex?(string) !(string =~ /something/i).nil? end 

由于我希望这一般工作,而不仅仅是针对任何特定项目,我根本不想修改环境。

我只需使用普通match方法的返回值作为条件,就可以使它工作。 测试此示例字符串的正面和负面情况:

 irb(main):014:0> if "123".match(/.2./); puts "worked"; end worked => nil irb(main):015:0> if "123".match(/.3./); puts "worked"; end => nil