如何确定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 中不是 nil
或 false
的所有内容都是真实的,因此您可以在条件中使用此正则表达式。如果你真的想要一个布尔值,你可以使用!!
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?的主要内容,如果未能解决你的问题,请参考以下文章