Ruby:布尔正则表达式方法的正确语法是什么?
检查模式的字符串的方法的正确语法是什么,如果正则表达式匹配,则返回true或false?
基本理念:
def has_regex?(string) pattern = /something/i return string =~ pattern end
使用案例:
if has_regex?("something") # woohoo else # nothing found: panic! end
如果你想把模式放在一个方法中,你就可以这样做
def has_my_pattern(st) st =~ /pattern/ end
或者,或许更好,将模式放在类变量中?
在你提出的问题中:
…检查字符串中的模式的方法,如果正则表达式匹配则返回true或false
正如johannes所指出的,如果模式不匹配, String=~
将返回nil
,否则匹配单词的字符串中的位置将返回nil
。 此外,他在Ruby中陈述除了nil
和false
之外的所有内容都表现得 true
。 所有这一切都是正确的。
但是,它们并不完全 true
或false
。 因此,最后一步是将值强制为Boolean
。 这是通过将结果包装在双重刘海中来true
。
def has_regex?(string) !!(string =~ /something/i) end
你的代码看起来很好,但你可以写得更小。
String#=~
的返回值以这种方式表现:
- 如果模式不匹配则
nil
- 匹配单词开始的字符串中的位置
在Ruby中,除了nil
和false
之外的所有内容在条件语句中都表现为true
,因此您可以编写
if string=~ pattern # do something else # panic end
要使其返回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
如果您使用的是Ruby 2.4或更高版本,则会出现String#match?(regex)
和Regexp#match?(string)
方法,这些方法返回没有转换shenanigans的booleans(通常不需要),并且具有更高的启动性能。
https://ruby-doc.org/core-2.4.0/Regexp.html#method-i-match-3F
对于Ruby> = 2.4或Rails,您可以:
regexp.match?(string)
将它添加到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
对于任何人的未来参考, bbatsov的ruby风格指南不赞成双重刘海。 而不是使用双重爆炸,只需检查值是否为零。 如果值不是nil,则存在。
而不是这样做:
def has_regex?(string) !!(string =~ /something/i) end
你总是可以这样做:
def has_regex?(string) !(string =~ /something/i).nil? end
由于我希望这一般工作,而不仅仅是针对任何特定项目,我根本不想修改环境。
我只需使用普通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