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

时间:2010-02-07 00:12:35

标签: ruby regex syntax

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

基本理念:

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

用例:

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

10 个答案:

答案 0 :(得分:43)

在你提出的问题中:

  

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

johannes指出,String=~如果模式不匹配,则返回nil,否则返回匹配单词的字符串中的位置。此外,他在Ruby中说明除nilfalse 之外的所有内容都与 true相似。所有这些都是对的。

但是,它们不是完全 truefalse。因此,最后一步是将值强制为Boolean。这是通过将结果包装成双重刘海返回true来实现的。

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

答案 1 :(得分:15)

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

String#=~的返回值表现如下:

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

在Ruby中,除nilfalse之外的所有内容都与条件语句中的true相似,因此您只需编写

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

答案 2 :(得分:11)

使其返回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

答案 3 :(得分:5)

如果您使用的是Ruby 2.4或更高版本,则有String#match?(regex)Regexp#match?(string)方法返回布尔值而没有转换恶作剧(通常不需要),并且具有更高的启动性能。

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

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

答案 4 :(得分:5)

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

 regexp.match?(string)

答案 5 :(得分:2)

将它添加到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 

答案 6 :(得分:1)

对于任何人未来的参考,双重刘海都不受bbatsov's ruby style guide的影响。不要使用双重爆炸,只需检查值是否为零。如果值不是,则存在。

而不是这样做:

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

您可以随时执行此操作:

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

答案 7 :(得分:1)

我没有足够的声誉来发表评论,所以我会回答。

the Ruby Style Guide中建议不要使用viljar建议的===,这会导致Rubocop投诉(根据默认规则)。

我发现最容易理解的方式是:

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

答案 8 :(得分:0)

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

我能够通过简单地使用普通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

答案 9 :(得分:-1)

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

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

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