在Ruby中,如何通过布尔值检查一个字符串是否与正则表达式匹配?

4
在Ruby中,我看到很多代码做像这样的事情:

def test(s)
  s =~ /Macintosh/
end

测试一个字符串是否符合正则表达式的方法通常是使用=~运算符。不过,这会返回一个整数或空值,具体取决于它是否找到匹配项。有没有一种方法可以进行相同的操作,但使其返回布尔值来指示它是否匹配?

我想到的两个可能的解决方案是!(s =~ /Macintosh/).nil?!(s !~ /Macintosh/),但这些都不太容易理解。是否有类似以下的方法:

def test(s)
  s.matches?(/Macintosh/)
end

2
!!(string =~ /some regex/)是什么意思? - Radi
1
@rathrio会检查然后检查是否为nil,我想知道是否有一个布尔方法可以返回true或false。 - kddeisz
只是出于兴趣:你想要一个布尔值的具体原因是什么?在大多数情况下,返回nil或非nil值都可以正常工作,对吧? - Radi
问题在于,如果针在干草堆的位置0处,=~返回0。虽然Ruby将0评估为true,但MySQL不会。这是Rails的一个问题。 - kddeisz
啊,我明白了。好的,知道了!谢谢。 - Radi
3个回答

11

您可以使用这个:

def test(s)
    /Macintosh/ === s
end

问题在于是否存在一种方法可以进行布尔检查,而无需在最后检查 nil。 !! 与 .nil? 相同。 - kddeisz
@kdeisz: 礼品篮在哪里? - Casimir et Hippolyte
我在这里遇到了一个 Rubocop 错误... 避免使用 case 相等运算符(===)。我该如何使用 match 方法来代替 ===? - ASM
顺便提一下,为布尔方法添加一个 ? 是一个好的编程风格,例如 test?(s) - Darren Weber

1
三元语法可能有助于或适合不同的风格偏好:
x = '10.0.0'
x =~ /\d*\.\d*\.\d*/ ? true : false  # => true

# Unlike c-style languages, 0 is true in ruby:
x =~ /\d*\.\d*\.\d*/                 # => 0
0 ? true : false                     # => true

比较运算符 === 的顺序很重要[1],例如:

/\d*\.\d*\.\d*/ === x
#=> true
x === /\d*\.\d*\.\d*/
#=> false

[1] https://ruby-doc.org/core-2.2.0/Regexp.html#method-i-3D-3D-3D

[1] 这是一个关于 Ruby 正则表达式的链接。

0
自从 Ruby 2.4.0 版本以来,你可以使用 Regexp#match 方法,它会返回一个布尔值结果;
/Macintosh/.match?(s)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接