21

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

目前,如果电子邮件地址以 r+ 开头,则为真,否则为假。这将帮助我们的服务器忽略我们遇到的大量垃圾邮件。

例子:

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

用 Rails/ruby/regex 处理这个问题的最有效方法是什么?

谢谢

目标

是轨道/红宝石中的一个衬垫,具有:

ABORT if XXXXX == 0
4

5 回答 5

37

这将匹配:

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

例子:

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

由于Ruby 中所有不真实nil或真实的东西,你可以在条件下使用这个正则表达式。false如果你真的想要一个布尔值,你可以使用!!成语:

>> !!('vigraaaa@site.com' =~ /^r\+.*@site.com$/) #=> false
>> !!('r+kldslkadslkadslk@site.com' =~ /^r\+.*@site.com$/) #=> true
于 2011-09-09T18:02:01.350 回答
11

如果你在 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) 是一个测试 Ruby 正则表达式 pre-1.9 的好站点。(1.9 的正则表达式添加了诸如前瞻之类的东西。)

于 2011-09-09T18:01:15.457 回答
10

如果您不想使用“!!” 操作员:

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

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

"foo" =~ /^f/ ? true : false
于 2014-12-08T14:33:23.743 回答
7

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

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

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

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

/YOUR_REGEX/ === 'YOUR_STRING'

于 2017-01-21T17:17:19.757 回答
1

Regexp#match?已添加到Ruby-2.4.0。请参阅Regexp#match 文档

irb(main):001:0> "ack!".match? /a(b|c)/
=> true
irb(main):002:0> "add".match? /a(b|c)/
=> false
于 2020-04-06T17:18:34.127 回答