【问题标题】:Boolean check if a string matches a regex in ruby?布尔检查字符串是否与 ruby​​ 中的正则表达式匹配?
【发布时间】:2014-02-20 10:37:43
【问题描述】:

在 ruby​​ 中,我看到很多代码在做这样的事情:

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

测试一个字符串是否匹配一个正则表达式。但是,这将返回一个 fixnum 或 nil,具体取决于它是否找到匹配项。有没有办法做同样的操作,但它是否返回一个布尔值来判断它是否匹配?

我想到的两种可能的解决方案是!(s =~ /Macintosh/).nil?!(s !~ /Macintosh/),但它们似乎都不是很可读。有没有类似的东西:

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

【问题讨论】:

  • !!(string =~ /some regex/) 呢?
  • @rathrio 会检查然后检查 nil,我在问是否有一个布尔方法可以返回 true 或 false。
  • 只是出于兴趣:您需要布尔值是否有特定原因?在大多数用例中,返回 nil 或非 nil 值都可以正常工作,对吧?
  • @rathrio 问题是,如果针在大海捞针中的位置 0,=~ 返回 0。虽然 ruby​​ 将 0 评估为 true,但 mysql 不会。这是一个轨道的事情。
  • 啊,我明白了。很高兴知道!谢谢。

标签: ruby regex


【解决方案1】:

你可以用这个:

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

【讨论】:

  • 问题是是否存在进行布尔检查的方法,而不需要在最后检查 nil。 !!和 .nil 一样吗?。
  • @kdeisz:礼品篮在哪里?
  • 我遇到了一个 rubocop 错误...避免使用大小写相等运算符 (===)。我怎样才能使用匹配方法===?
  • 顺便说一句,将? 添加到布尔方法中是一种很好的风格,如test?(s)
【解决方案2】:

三元语法可能有助于或适合不同的风格偏好:

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

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2022-01-18
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多