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

Mar*_*rco 17 ruby regex syntax

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

基本理念:

def has_regex?(string)
    pattern = /something/i
    return string =~ pattern
end
Run Code Online (Sandbox Code Playgroud)

使用案例:

if has_regex?("something")
    # woohoo
else
    # nothing found: panic!
end
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 44

在你提出的问题中:

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

正如johannes所指出的那样,如果模式不匹配则String=~返回nil,并且字符串中匹配单词的位置也会相反.此外,他在Ruby中陈述除了nilfalse 表现的 一切true.所有这一切都是对的.

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

def has_regex?(string)
    !!(string =~ /something/i)
end
Run Code Online (Sandbox Code Playgroud)

  • 或者:`!(string!〜/ something/i)` (2认同)

joh*_*nes 15

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

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

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

在Ruby中一切,除了nilfalse行为就像true在条件语句中,所以你可以只写

if string=~ pattern
  # do something
else
  # panic
end
Run Code Online (Sandbox Code Playgroud)

  • 您的答案适用于所提供的用例,但没有正确回答OP的问题(这对于来到这里的人来说很重要).例如,当将结果分配给ActiveRecord对象时,这是至关重要的:``Foo.new(admin:(role =〜/ admin /)).admin`在`role`为"admin"时返回`false`,因为`= ~`返回0,由Rails变为`false`.只是在说'. (3认同)

小智 11

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

def has_regex?(string)
    pattern = /something/i
    return pattern === string
end
Run Code Online (Sandbox Code Playgroud)

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


mat*_*uck 6

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


Hen*_*k T 6

对于Ruby> = 2.4或Rails,您可以执行以下操作:

 regexp.match?(string)
Run Code Online (Sandbox Code Playgroud)


Sha*_*ird -3

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

def has_my_pattern(st)
    st =~ /pattern/
end
Run Code Online (Sandbox Code Playgroud)

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

  • 这不会返回布尔值。@Ryan 的答案是正确的。 (11认同)