web-dev-qa-db-ja.com

Ruby正規表現によるメール検証

多数のメールのリストがあります。多くのメールにはタイプミスがあります。有効なメールをチェックする文字列を作成しようとしています。

これは私が正規表現のために持っているものです。

def is_a_valid_email?(email)
  (email =~ /^(([A-Za-z0-9]*\.+*_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\+)|([A-Za-z0-9]+\+))*[A-Z‌​a-z0-9]+@{1}((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,4}$/i)
end

電子メールがアンダースコアとして1つの期間のみである場合、合格します。名前自体に複数のピリオドが含まれるメールがたくさんあります。正規表現でそれを確認するにはどうすればよいですか。

[email protected] # <~~ valid
foo.bar#gmail.co.uk # <~~~ not valid
[email protected] # <~~~valid 
[email protected] # <~~ not valid 
get_at_m.e@gmail  #<~~ valid

誰かが私の正規表現を書き換えるのを手伝ってくれますか?

44
T0ny lombardi

TL; DR:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

元の答え

あなたは物事をたくさん複雑にしているようです、私は単に使用します:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

michael hartl's Rails book

これはドットの要件を満たしていないため、次のように単純に修正できます。

VALID_EMAIL_REGEX = /\A([\w+\-]\.?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

CAustinが述べたように、他にも多くのソリューションがあります。

編集:

@installeroによって、ハイフンが含まれるサブドメインで元のファイルが失敗することが指摘されました。このバージョンは機能します(最初に文字クラスに数字とハイフンが欠けていた理由はわかりません)。

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
82
Mike H-R

これは、少なくとも2.2.1以降、標準ライブラリに組み込まれています。

URI::MailTo::EMAIL_REGEXP
35
Joshua Hunter

David Celis による素晴らしい記事があります。これは、上記のMikeが投稿したものを含め、メールアドレスの検証に使用できるすべての正規表現が間違っている理由を説明しています。

記事から:

ローカル文字列(@の前にある電子メールアドレスの部分)には、次の文字を含めることができます。

    `! $ & * - = ` ^ | ~ # % ' + / ? _ { }` 

しかし、何だと思いますか?引用符で囲んでエスケープする場合は、ほとんどすべての文字を使用できます。たとえば、「これらすべてのスペースを見てください!」@ example.comは有効なメールアドレスです。いいね.

基本的なチェックを行う必要がある場合、最適な正規表現は単に/@/

25
John Carney

これはより短く安全です:

/\A[^@\s]+@[^@\s]+\z/

レギュラーはDevise gemで使用されます。ただし、これらの値にはいくつかの脆弱性があります。

  ".....@a....",
  "david.gilbertson@SOME+THING-ODD!!.com",
  "a.b@example,com",
  "a.b@example,co.de"

Ruby library URI::MailTo::EMAIL_REGEXP

電子メール検証のための宝石があります

電子メール検証

18
ilgam

最近では、Rubyは標準ライブラリで電子メール検証正規表現を提供します。URI::MailToモジュール、それはURI::MailTo::EMAIL_REGEXP。 Ruby 2.4.1で評価される

/\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/

ただし、定数自体を使用するだけです。

11
kaikuchn

この本の例は、メールと-サブドメイン。

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

例えば:

> '[email protected]' =~ VALID_EMAIL_REGEX
=> 0
4
installero

あなたのものは確かに複雑です。

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

上記のコードで十分です。

明確にするために、上記の式の各部分の説明:

正規表現の開始:

/

文字列の先頭に一致する:

\A

少なくとも1つのWord文字、プラス、ハイフン、またはドット:

[\w+\-.]+

文字通りの「アットマーク」:

@

リテラルドット:

\.

少なくとも1つの手紙:

[a-z]+

文字列の末尾に一致する:

\z

正規表現の終わり:

/

大文字小文字を区別しません:

i

再び組み立てる:

/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

Rubular をチェックして、式を記述するときに式を簡単にテストします。

1
bdbasinger

これを試して!!!

/\[A-Z0-9._%+-\]+@\[A-Z0-9.-\]+\.\[AZ\]{2,4}/i

選択されたメール文字列のみ

"Robert Donhan" <[email protected]>sadfadf
Robert Donhan <[email protected]>
"Robert Donhan" [email protected]
Robert Donhan [email protected]
0
Kiry Meas