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

问题描述 投票:0回答:11

检查字符串是否存在模式并在正则表达式匹配时返回 true 或 false 的方法的正确语法是什么?

基本理念:

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

使用案例:

if has_regex?("something")
    # woohoo
else
    # nothing found: panic!
end
ruby regex syntax
11个回答
46
投票

您在问题中说:

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

正如 johannes 指出的那样,如果模式不匹配,则

String=~
返回
nil
,否则返回字符串中匹配单词所注视的位置。此外,他在 Ruby 中陈述了除了
nil
false
behave like
true
之外的所有内容。这一切都是对的。

但是,它们并不完全

true
false
。因此,最后一步是将值强制为
Boolean
。这是通过将结果包装在双刘海中返回
true
来实现的。

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

15
投票

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

String#=~
的返回值的行为如下:

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

在 Ruby 中,除了

nil
false
之外的所有内容都像条件语句中的
true
一样,所以你可以直接写

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

14
投票

如果您使用的是 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/


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


10
投票

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

 regexp.match?(string)

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 

1
投票

供任何人未来参考,bbatsov 的红宝石风格指南中双刘海是不受欢迎的。不要使用双声,只需检查值是否为 nil 即可。 如果该值不为零,则它存在。

而不是这样做:

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

您始终可以这样做:

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

1
投票

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

按照viljar的建议,在Ruby风格指南中建议不要使用===,这会导致Rubocop投诉(在默认规则下)。

我发现最易读的方式是:

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

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

0
投票
def has_regex?(string)
  string.include? pattern
end

-3
投票

如果你想将模式放入方法中,你可以这样做

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

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

© www.soinside.com 2019 - 2024. All rights reserved.