21

メール処理でtrueまたはfalseを返すテストを作成したいと思います。

今のところ、電子メールアドレスがr +で始まる場合、それはtrueであり、そうでない場合はfalseです。これは、サーバーが攻撃を受けているスパムの多くを無視するのに役立ちます。

例:

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)は、1.9より前のRuby正規表現をテストするのに適したサイトです。(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 に答える