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

Posted

技术标签:

【中文标题】如何确定rails中是不是存在匹配返回true或false?【英文标题】:How to determine if there is a match an return true or false in rails?如何确定rails中是否存在匹配返回true或false? 【发布时间】:2011-11-13 23:53:37 【问题描述】:

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

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

例子:

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

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

谢谢

目标

在 rails/ruby 中是一个单一的衬里:

ABORT if XXXXX == 0

【问题讨论】:

【参考方案1】:

这将匹配:

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

例子:

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

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

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

【讨论】:

谢谢,但我怎么能在 rails/ruby 中做到这一点,所以如果 XXXXX == 0 则它会中止 尝试了你的最后一个想法,导致语法错误,意外 $undefined, expecting ')' (SyntaxError) 仍然无法正常工作,尝试 if (params[:to].to_s =~ (/^r\+.*@site.com$/)) == nil 抱歉语法错误,我从 IRB 复制过来,意识到我忘记了锚点,然后将它们添加到错误的位置:-( 谢谢迈克尔,但我仍然收到错误:Rails.logger.info !!(params[:to] =~ /^r\+.*@site.com/$)跨度> 【参考方案2】:

如果您在 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 的正则表达式添加了前瞻等内容。)

【讨论】:

Rails 之外还有一个字符串 "start_with?" (注意单数)。 不确定我是否喜欢 starts_with 的想法,它只会匹配 r 而不是 r+,这对垃圾邮件发送者更有用 你为什么不能start_with? "r+"?我的意思是,我也会使用正则表达式,因此它可以匹配+ 之前的任何内容,但是 start_with?将匹配你给它的任何东西。 注意:start_with? 已添加到 Ruby 核心。见ruby-doc.org/core-2.1.2/String.html#method-i-start_with-3F 我认为上述答案具有误导性,因为"foo" =~ /^f/ #=> 0"foo" =~ /^g/ #=> nil【参考方案3】:

如果您不想使用“!!”运营商:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

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

/YOUR_REGEX/ === 'YOUR_STRING'

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于如何确定rails中是不是存在匹配返回true或false?的主要内容,如果未能解决你的问题,请参考以下文章

尝试匹配两个数组中的值,如果存在匹配值,则输出 true

f#中字符串开头的模式匹配

确定文件是不是存在或为 0 字节

如何从 Bash 脚本中检查程序是不是存在?

递归确定是不是存在与给定 int 参数匹配的正 int 数组的子集和?

即使存在未设置为true,Rails验证也需要数值