如何确定在rails中是否存在匹配返回true或false?

时间:2011-09-09 17:50:28

标签: ruby-on-rails ruby regex ruby-on-rails-3 gsub

我想创建一个为电子邮件处理返回true或false的测试。

目前,如果电子邮件地址以r +开头,那么它是真的,否则它是假的。这将有助于我们的服务器忽略我们遇到的很多垃圾邮件。

示例:

r+kldslkadslkadslk@site.com .. true
r+123123312@site.com .. true
vigraaaa@site.com .. FALSE

使用Rails / ruby​​ / regex处理此问题的最有效方法是什么?

由于

目标

带有导轨/红宝石的单个衬垫:

ABORT if XXXXX == 0

5 个答案:

答案 0 :(得分:34)

这将匹配:

/^r\+.*@site.com$/

示例:

>> 'r+kldslkadslkadslk@site.com' =~ /^r\+.*@site.com$/ #=> 0
>> 'vigraaaa@site.com' =~ /^r\+.*@site.com$/ #=> nil

由于Ruby中不是nilfalse的所有内容都是真实的,因此您可以在条件中使用此正则表达式。如果你真的想要一个布尔值,你可以使用!!成语:

>> !!('vigraaaa@site.com' =~ /^r\+.*@site.com$/) #=> false
>> !!('r+kldslkadslkadslk@site.com' =~ /^r\+.*@site.com$/) #=> true

答案 1 :(得分:10)

如果你在Rails中,有一个starts_with?字符串上的方法:

"foo".starts_with?('f') # => true
"foo".starts_with?('g') # => false

在Rails之外,正则表达式是一个合理的解决方案:

"foo" =~ /^f/ # => true
"foo" =~ /^g/ # => false

因为Ruby在if语句中使用了真值,如果你最终使用正则表达式,你可以只使用返回值来切换:

if "foo" =~ /^f/
  puts "Was true!"
else
  puts "Was false!"
end

如果您正在编写方法并希望返回布尔结果,则可以始终使用双重技巧:

def valid_email?
  !!("foo" =~ /^f/)
end

Rubular(rubular.com)是测试1.9之前的Ruby正则表达式的好网站。 (1.9的正则表达式增加了诸如前瞻性的东西。)

答案 2 :(得分:8)

如果你不想使用“!!”操作者:

!!("foo" =~ /^f/)

你可以使用三元运算符(可能看起来更明显):

"foo" =~ /^f/ ? true : false

答案 3 :(得分:7)

您也可以使用'==='运算符

/f/ === 'foo' #=> true

/f/ === 'bat' #=> false

注意:正则表达式部分位于左侧:

  

/ YOUR_REGEX / ==='YOUR_STRING'

答案 4 :(得分:1)

Regexp#match?已添加到Ruby-2.4.0。参见Regexp#match documentation

irb(main):001:0> "ack!".match? /a(b|c)/
=> true
irb(main):002:0> "add".match? /a(b|c)/
=> false