JavaScriptでメールアドレスを検証する方法


4377

JavaScriptでメールアドレスを検証するための正規表現はありますか?



60
これを正しく取得してください。あまりにも多くのWebサイトが私の「firstName@secondName.name」のメールアドレスを嫌っています。すべてのトップレベルドメインが2文字または3文字で終わっているわけではありません。
Ian Ringrose 2011

41
私が100%反対している電子メールの正規表現チェックの使用に対するサポート。「foo+bar@gmail.com」のメールアドレスが無効だと言われてうんざりです。最良のオプションは、ユーザーに電子メールを2回入力するように依頼し、正規表現チェッカーを使用する必要がある場合は、電子メールアドレスが有効ではないように見えることをユーザーに伝え、入力したかどうかを確認することです。正しい。正規表現チェックでWHATがチェックアウトしなかったと指摘するまでは、フォームの送信を止めないでください。
Soundfx4 2016年

17
@ Soundfx4:これは答えであり、そのように受け入れられるべきです。住所が正しいかどうかをテストするのは馬鹿げたことです。顧客を不満にさせる最善の方法です。私は二度入力するためのアドレスと、いくつかの可能性の問題(行方不明があるというヒントを要求@;comなど)を、彼らが望む(そして、彼らは私を送って何でも受け入れる)場合、ユーザはそれらを修正しましょう
WoJ

4
WoJの回答に完全に同意します。有効な電子メールアドレスの形式は複雑すぎて、単純な正規表現では確認できません。アドレスが有効であることを確認する唯一の方法は、それを試すことです。
ニコール

回答:


4946

正規表現を使用するのがおそらく最善の方法です。あなたはここでたくさんのテストを見ることができますクロムから取られた)

function validateEmail(email) {
    const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}

これは、Unicodeを受け入れる通常の式の例です。

const re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

ただし、JavaScriptの検証だけに依存するべきではないことに注意してください。JavaScriptは簡単に無効にすることができます。これもサーバー側で検証する必要があります。

上記の動作例は次のとおりです。

function validateEmail(email) {
  const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  const $result = $("#result");
  const email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").on("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>


575
この正規表現は、有効な使用中の電子メールを排除します。使ってはいけません。適切な正規表現を取得するには、「RFC822」または「RFC2822」のGoogle。
Randal Schwartz

42
これはRFC 822の例も受け入れません。いくつかの単純なケースでは、a \ @ b @ c.com、a(b)@ c.comと一致しません。詳細については、RFCを参照してください。有効なアドレス[^ @] + @ [^ @] + \。[^ @] +を拒否せず、一般的なエラーから保護する正規表現を次に示します。
Vroo 2012年

126
@GoodPerson n @ aiにメールを送って、クールなメールアドレスがあることを伝えました。しかし、悲しいかな、Gmailは私をさせません。私のサイトのJavaScript検証だけではなく、メールで他の人と通信するのに大きな問題があるのではないかと思います。しかし、挑戦に立ち上がってくれてありがとう。
ベンロバーツ

26
これは、ほとんどのネイティブスピーカーにとって良いように思われるソリューションですが、トルコのテストに合格しません(Joel Spolskyを参照)。ほとんどのユニコード文字が許可されており、たとえばアルゼンチンでは、「ñoñó1234@server.com」などのアドレスは完全に正常です。joelonsoftware.com/articles/Unicode.html
オリゴフレン

139
メールアドレス、期間は検証できません。メールアドレスを検証できるのは、メールアドレスのプロバイダーだけです。たとえば、この回答は次のメールアドレスを示しています:%2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.comすべて有効ですが、Gmailではこれらのメールアドレスを許可しません。これを行うには、電子メールアドレスを受け入れ、その電子メールアドレスに、ユーザーが有効性を確認するためにアクセスする必要があるコード/リンクを記載した電子メールメッセージを送信します。
Kevin Fegan 14

830

以下の形式で本当に単純な検証をしたい人のために、Jaymonの回答を少し修正しました。

anystring@anystring.anystring

正規表現:

/\S+@\S+\.\S+/

JavaScript関数の例:

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }
    
console.log(validateEmail('anystring@anystring.anystring'));


69
少数のユーザーに問題を引き起こし、将来は有効でなくなる可能性がある20倍の長さのものを実装できます。または、ImmortalFireflyのバージョンを入手して、少なくともリアルに見えるように努力することを確認できます。アプリケーションによっては、実際には存在しないメールアドレスを入力することで問題を引き起こす人ではなく、通常とは異なるメールを受け入れないため、誰かに遭遇する可能性が高くなります。 100%有効なRFC2822メールアドレスですが、未登録のユーザー名またはドメインを使用しています)賛成です!
user83358 2012

82
@ImmortalFirefly、指定した正規表現は実際に一致しname@again@example.comます。行をJavaScriptコンソールに貼り付けてみてください。私はあなたの意図はテキスト全体だけに一致することであったと私は信じています。テキストの始まり '^'とテキストの終わり '$'演算子が必要です。私が使用しているのは/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
OregonTrail

8
この検証に基づいて、このメールは有効です:check @ this..com
Ehsan

4
うーん。 ウィキペディアによると、これ"very.unusual.@.unusual.com"@example.comは有効なメールアドレスです。 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('"very.unusual.@.unusual.com"@example.com') // false。おっとっと。
ベーコンビット

3
これも可能@@@.@ですか?:D
hfossli 2017

763

完全を期すために、ここには別のRFC 2822準拠の正規表現があります

公式の標準はRFC 2822として知られています。有効な電子メールアドレスが準拠する必要がある構文について説明します。あなたは、することができます(しかし、あなたはいけません - 読み、この正規表現でそれを実装します):

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

(...)二重引用符と角括弧を使用して構文を省略すると、RFC 2822のより実用的な実装が得られます。それでも、今日実際に使用されているすべての電子メールアドレスの99.99%に一致します。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

さらに可能な変更は、2文字の国コードのトップレベルドメインと、特定の汎用トップレベルドメインのみを許可することです。この正規表現は、などのダミーのメールアドレスをフィルタリングしますasdf@adsf.adsf。あなたは、新しいトップレベルドメインが追加されているとして、それを更新する必要があります

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

したがって、公式の基準に従っている場合でも、トレードオフが必要です。オンラインライブラリやディスカッションフォーラムから正規表現を盲目的にコピーしないでください。常に自分のデータと自分のアプリケーションでテストしてください。

強調鉱山


84
注:「今日の実際の使用状況」は、コードが200xで書かれたときに有効だった可能性があります。コードその特定の年を超えて使用される可能性があります。(私はすべてのためのダイム持っていた場合、私は、世界の銅とニッケル市場の隅ことができ、私は修正しなければならなかった「MEHを、誰もそれらの特定のものを除いて4 + -letter TLDを使用しないだろう」;))
Piskvorは、建物の左に

7
RFC 2822の実用的な実装では、単一文字のドメイン拡張を防ぐために、末尾を少し変更する必要があります。/ [a-z0-9!#$%& '* + \ / =?^ _ {|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_{|}〜-] +)* @(?:[a-z0-9](?:[a-z0-9 -] * [a-z0-9])?\。)+ [a-z0-9] [a-z0-9-] * [a-z0-9] /
ファレルは

5
また、最初の部分はする必要があります([ユーザーは自分のメールアドレスを大文字にしたときに偽陰性を回避するために、資本AとAzの?。
ドン・ローリング

9
@DonRollingしないでください。これは、「AからZ、aからz」を意味するだけでなく、「[\] ^ _ `」も意味します。これは「Z」と「a」の間にあるためです。\wとにかく慣例であるため、それを使用する前にメールアドレスを小文字にしてください。
Kirb 2016年

5
「新しいトップレベルドメインが追加されたら、更新する必要があります。」さて、今のところそれだけです-1500を超えるTLDが認識されています。
Nathan Osman 2017年

377

うわー、ここには多くの複雑さがあります。あなたがしたいことが最も明白な構文エラーをキャッチすることだけであるなら、私はこのようなことをします:

^\S+@\S+$

これは通常、ユーザーが行う最も明白なエラーをキャッチし、フォームがほぼ正しいことを保証します。これがJavaScript検証のすべてです。


70
メールを送信して何が起こるかを確認することがメールアドレスを検証する唯一の確実な方法である+1として、単純な正規表現の一致以上のことを行う必要はありません。
kommradHomer

20
それでもシンプルに保つことができますが、「。」があることを確認するためにもう少し行います。@の後に数字または数字のみが続くため、me @ here、me @ here @、me @ herecomなどは無効です... ^ \ S + @ \ S + [\。] [0-9a-z ] + $
ティムフランクリン

14
電子メールアドレスにはスペースを含めることができると思います。使用する方が良いでしょう.+@.+
Sam

11
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð") true
gtournie 2014年

110
@gtournie誰も気にしない。誰もそれを誤って電子メールフィールドに入力する予定はありません。それがすべてフロントエンド検証です。人々が誤って自分の名前などの間違った情報を電子メールフィールドに入力しないようにします。
貧弱

330

電子メールを検証するために正規表現を使用することを決定した2番目のことを理解する必要があることがあります。それはおそらく良いアイデアではありません。いったんそれに慣れると、途中に到達できる多くの実装がそこにあります。この記事ではそれらをうまくまとめています。

ただし、要するに、ユーザーが入力した内容が実際にメールであることを確実に確実に確認する唯一の方法は、実際にメールを送信して、何が起こるかを確認することです。それ以外はすべて推測です。


112
-1正規表現の制御に合格しないメールアドレスの検証に時間をかけたいのはなぜですか?
kommradHomer

63
@kommradHomer-メールアドレスの検証に使用する正規表現は間違いなく間違いであり、有効なメールアドレスを除外するため、「regex invalid」アドレスはほとんど常に有効です。メールアドレスがあるname_part@domain_partと、実質的には何も、含めて@、name_partで有効です。住所foo@bar@machine.subdomain.example.museumは合法ですが、エスケープする必要がありますfoo\@bar@machine....。メールが「example.com」などのドメインに到達すると、そのドメインはメールを「ローカル」にルーティングできるため、「奇妙な」ユーザー名とホスト名が存在する可能性があります。
スティーブンP

6
stackoverflow.com/a/1373724/69697の voyagerの回答の2番目の正規表現は実用的であり、偽陰性はほとんどありません。私はここの@kommradHomerに同意します-必要がないのになぜメールを送信するのですか?私は理解できない正規表現に対する再帰的な嫌悪を理解でき、コードを単純に保ちたいと思っていますが、これは2行のコードであり、間違いなく無効なアイテムをすぐに取り除いてサーバーに多大なトラブルをもたらすことができます。正規表現自体は役に立ちませんが、サーバーサイドの検証を補完するものとして役立ちます。
Ben Regenspan 2013

6
@dmur「ほぼ常に有効」は過大評価していると認め.usますが、ドメインを持っているため、または+の左側にを使用したために、(完全に有効で機能している)電子メールアドレスがWebサイトによって拒否されることが多すぎます@-多くの場所は、これらの悪質なエラーを修正しましたが、(@の左側)ローカル部分は可能何でもドメインの所有者が望んでいます。-> "foo@bar.com"@example.com <-は有効なメールアドレスです。
Stephen P

8
@kommradHomer "正規表現で無効なアドレスは%100無効なアドレスです。" すみません...すみません。foo+bar@gmail.comは実際には有効なメールですが、有効なメールではないと何度も言われましたか。あなたの論理は非常に欠陥があります。次のようなメールでフォームを送信しました:thisisafakeemailbutitwillpassyourstupidregexcheck@regexchecksareretarded.comそして、何を推測しますか?正規表現チェックに合格します...しかし、それは有効なメールではありません(技術的にはそうですが、存在しないことをお約束します...しかし、彼のあごを傷つけます)。多くの人が言っているように、ITは悪い
考え

211

HTML5自体はメール検証を備えています。ブラウザがHTML5をサポートしている場合は、次のコードを使用できます。

<form><input type="email" placeholder="me@example.com" required>
    <input type="submit">
</form>

jsFiddleリンク

HTML5仕様から:

有効な電子メールアドレスが一致する文字列でemail、以下のABNFの生産を、のための文字セットがUnicodeがあります。

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

この要件は、RFC 5322の故意の違反です。RFC5322は、電子メールアドレスの構文が厳密すぎ( "@"文字の前)、曖昧すぎ( "@"文字の後)、緩い(コメントを許可する)構文を定義しています。 、空白文字、引用符で囲まれた文字列(ほとんどのユーザーにとってなじみのない方法)は、ここで実際に使用されます。

次のJavaScriptおよびPerl互換の正規表現は、上記の定義の実装です。

/^[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])?)*$/

29
これは良いことですが、問題はformタグの内側にあり、submit入力によって送信する必要があることです。また、エラーメッセージのスタイルを実際に設定することはできません。
Jason

3
以下の回答を追加して、フォームから解放して送信します。しかし、はい、通常、ブラウザは妥当性チェックのみを適用し、完全なRFC 822検証は適用しません。
Boldewyn

8
@ br1:「a」トップレベルドメインが存在しないからといって無効ではありません。イントラネットがIPに解決されている場合はどうなりますか?
空飛ぶ羊

7
HTML5メールフィールドタイプは、user @ emailのようなメールを受け入れます
Puce

1
@Puceのコメントに注意してください:HTML 5の電子メール入力は受け入れますuser@emailが、たとえば、PHP は受け入れfilter_varません。これは問題を引き起こす可能性があります。
texelate

136

これが最良の解決策であることがわかりました:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

次の形式を使用できます。

1. prettyandsimple@example.com
2. very.common@example.com
3. disposable.style.email.with+symbol@example.com
4. other.email-with-dash@example.com
9. #!$%&'*+-/=?^_`{}|~@example.org
6. "()[]:、; @ \\\"!#$%& '* +-/ =?^ _ `{} | 〜.a "@ example.org
7. "" @ example.org(引用符の間のスペース)
8.üñîçøðé​​@example.com(ローカル部分のUnicode文字)
9.üñîçøðé​​@üñîçøðé​​.com(ドメイン部分のUnicode文字)
10.Pelé@example.com(ラテン)
11.δοκιμή@παράδειγμα.δοκιμή(ギリシャ語)
12.我買@屋企。香港(中国語)
13.甲斐@黒川。日本(日本語)
14.чебурашка@ящик-с-апельсинами.рф(キリル文字)

それは明らかに汎用性が高く、基本的なanything@anything.anythingフォーマットを適用しながら、すべての重要な国際文字を許可します。RFCで技術的に許可されているスペースをブロックしますが、それらは非常にまれであるため、これを行うことができます。


9
これはまさに私がやっていることです。これらの「複雑な」回答はすべて問題を引き起こします。それらは、puny-code IDNを許可しないか、TLDの固定セットを使用するか、ユーザーのメールプレフィックス(@の前)に[@ çµ.öのような文字を使用しないように不必要に制限します。またはドメイン名。フロントエンドのJavaScript(原因のバックエンドではない)は、セキュリティ上の理由から検証するには不十分です。それで、なぜユーザーが基本的なタイプミスを防ぐのを手伝わないのか。基本的なタイプミスがあります:TLDまたはユーザーの接頭辞(@の前)またはドメインの一部またはミスタイプ忘れる@よう.(またはその逆)。当然のことながら、サーバー側の制限をさらに厳しくする必要があります。
Hafenkranich、2015年

いくつかの奇妙な理由でusername@domain.com、このパターンでは機能しません
アインシュタイン

2
あなたの正規表現によれば「_.............. kamal@gmail.com」は有効ですが、それはいけません!
Kamal Nayan 2016年

1
このソリューションをいじくり回し
r

7
この正規表現は正しいです。もし誰かがそのように彼らの電子メールを入力しているならa@b@c@d.x.y.@.z、多分彼らは悪い時間を過ごすに値するのでしょうか?:D
corysimmons 2018

94

最新のブラウザーでは、純粋なJavaScriptとDOMを使用して@Sushilの回答に基づいて構築できます

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

フィドルの例をhttp://jsfiddle.net/boldewyn/2b6d5/にまとめました。機能検出とSquirtle's Answerの必要最低限の検証を組み合わせることで、正規表現の大虐殺から解放され、古いブラウザに煩わされることはありません。


4
これは問題を回避するための賢いアイデアですが、ブラウザにも不正な検証があるため機能しません。たとえば、Chrome、Firefox、Safariの現在のバージョンと.@a同様trueに検証します。
ハンク

13
@HenryJackson残念ながら、この場合はい。これは、有効な電子メールアドレスであるRFCによると(イントラネットを考える)ためです。検証が狭すぎて偽陰性を生成した場合、ブラウザーは焼き上がります。
Boldewyn 2013年

3
機能の検出と優雅な機能低下を含むように更新されました。新しいブラウザで動作しなくなりますが、好きな正規表現を使用します。
ロニー

素晴らしい解決策。残念ながら、これはHTML5 +専用です。
エドワードオラミサン

3
これは、元の質問に対する最善の解決策です。はい、それはHTML5を使用しますが、このレベルの正確さを必要とするアプリケーションの大部分は確かにいずれにせよすでにHTML5に依存しているので、議論の余地があります。誰かのメールを確認せずに誰かのメールが有効かどうかを判断することは不可能なので、実際にそれを検証するためにそれほど多くの時間や労力を費やすべきではありません。明らかな構文やわんぱくな試みをすばやくチェックすることは、私たちが費やすべきすべての努力です。
Woody Payne

69

これは正しいRFC822バージョンです。

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

IDNアドレスは検証されません(info@üpöü.com)
DAH

66

JavaScriptは正規表現に一致できます。

emailAddress.match( / some_regex /);

ここだRFC22メールの正規表現は:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

1
@加藤:(?>バックトラッキングを停止したり、冗長な(?<angle><)…(?(angle)>)を提供したりするのを避けるなど、互換性のない拡張機能をいくつか使用しています|
Ry-

60

すべての電子メールアドレスには、アットマーク(@)が含まれています。その必要条件をテストします。

email.indexOf("@") > 0

もっと複雑なことを気にしないでください。電子メールがRFC構文的に有効であるかどうかを完全に判断できたとしても、それがその電子メールを提供した人物のものであるかどうかはわかりません。それが本当に重要なことです。

これをテストするには、検証メッセージを送信します。


3
「@」記号が複数ある場合はどうなりますか?他の制限されたシンボル?この検証は信頼できません...
eatmypants

56

RFCに準拠した電子メールアドレスの正しい検証は、1行の正規表現で実現できるものではありません。私がPHPで見つけた最良のソリューションの記事は、有効なメールアドレスとは何ですか?。明らかに、Javaに移植されています。この関数は複雑すぎて、移植してJavaScriptで使用できないと思います。JavaScript / node.jsポート:https : //www.npmjs.com/package/email-addresses

クライアントでデータを検証することをお勧めしますが、サーバーで検証を再確認してください。これを念頭に置いて、文字列がクライアントで有効な電子メールアドレスのように見えるかどうかを確認し、サーバーで厳密なチェックを実行できます。

文字列が有効なメールアドレスのように見えるかどうかを確認するために使用するJavaScript関数を次に示します。

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

説明:

  • lastAtPos < lastDotPos:(私が知る限り)サーバー名の一部にすることはできないため、ラスト@はラストの前にする必要があります。.@

  • lastAtPos > 0:最後のの前に何か(メールのユーザー名)があるはず@です。

  • str.indexOf('@@') == -1@@住所にない必要があります。場合でも@、電子メールのユーザー名の最後の文字として表示されますが、それは引用符で囲む必要がありそう"という間だろう@と最後の@アドレスインチ

  • lastDotPos > 2:たとえば、最後のドットの前には少なくとも3文字が必要a@b.comです。

  • (str.length - lastDotPos) > 2:最後のドットの後に2文字のドメインを形成するのに十分な文字が必要です。ブラケットが必要かどうかはわかりません。


このfnは見栄えが良いですが、トップの回答に書かれた正規表現よりも優れていますか?
Atul Goyal 2011

4
疑わしい。文字列が電子メールのように見えるかどうかを確認し、詳細をサーバー側のコードに任せるためにのみ使用します。
ミロシュラシッチ

'aaaa'のような任意の文字列、つまり '@'と '。'なしでOKを検証します。
Gennady Shumakher、2012

1
すべきではない。針が見つからない場合、lastIndexOf()は-1を返します。
ミロシュRašić

「場合でも@、電子メールのユーザー名の最後の文字として表示され、それはとても引用されなければなら"それの間だろう@と最後の@アドレスインチ」どう"@@"@example.comですか?
Ry-

47

これはhttp://codesnippets.joyent.com/posts/show/1917から盗まれました

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

7
これは、人気のあるドメイン.museum.travelドメインを除外します(後の4文字の制限のため.
bobobobo '16

4
{2,4}を{2,6}に変更しても問題ありません
アントンN

11
@Anton N:他にもおよそ数兆の問題があります。ファイナル{2,4}は、その有用なインジケーターにすぎません(「そのエラーが表示された場合、他のユーザーがいる可能性が高い」など)。最も基本的な 1は不足である+局所的な部分で、このコメントボックスは小さすぎて、上記でコミットされたすべてのエラーを指摘できません。
Piskvorが建物を去った

37
なんでできないのreturn filter.test(email.value);
MT。

3
@AntonN:これで10文字以上のTLD(xn--clchc0ea0b2g2a9gcd)ができました。まだ問題ありませんか?
Piskvorは、2014

42

これを行う:

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

どうして? これはRFC 2822基づいています。これは、すべての電子メールアドレスが準拠しなければならない標準です。そして、なぜ「より単純な」ものに悩むのかはわかりません...とにかくそれをコピーして貼り付けるつもりです;)

メールアドレスをデータベースに保存するときは、しばしば小文字にします。実際には、正規表現は通常、大文字と小文字を区別しないようにマークできます。これらの場合、これは少し短くなります:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

JavaScriptで使用されている例を次に示します(i最後に大文字と小文字を区別しないフラグを付けます)。

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('some.body@domain.co.uk') );


技術的には、一部のメールでは、引用符の中に@エスケープ文字を含む記号の前のセクションに引用符を含めることができます(そのため、メールユーザーは不快で@"..."それが引用符で書かれている限り)。誰もこれをしません!それは時代遅れです。ただし、これは真のRFC 2822標準に含まれているため、ここでは省略されています。

詳細:http : //www.regular-expressions.info/email.html


@Kondalでは/i、正規表現の末尾にフラグがあるため、JavaScriptコードは大文字と小文字を区別しません。大文字と小文字を区別しない比較である必要があることを述べましたが、それをより明確にします。
ライアンテイラー

チャームとして私のために働いた
アレックス

40

私はこの問題を解決することを本当に楽しみにしています。上記のメール検証の正規表現を変更しました

  • 元の
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

  • 修正
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

Wikipediaの電子メールアドレスの例を渡す。

そして、ここで結果を見ることができます

ここに画像の説明を入力してください


これは良い解決策のようです。新しいTLDと1文字のメールでも機能します
Mark Hughes

なぜjohn..doe@example.com正しくないのですか?これは有効なコーナーケースです。
Valerio Bozz

24

正規表現を使用して入力文字列を検証し、メールかどうかを確認しないでください。これは複雑すぎて、すべてのケースをカバーできるわけではありません。

ケースの90%しかカバーできないため、次のように記述します。

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

あなたはそれを洗練することができます。たとえば、「aaa @」は有効です。しかし、全体的には要点がわかります。そして、夢中にならないでください...単純な90%ソリューションは、機能しない100%ソリューションよりも優れています。

世界にはもっと単純なコードが必要です...


15
これにより、非常に多くの無効な電子メールアドレスを入力できるようになり、役に立たなくなります。
cazlab 2012年

3
デバッグがまったく不可能である必要はありません。このスレッドには、「 '@'が含まれているかどうか」よりも妥当性の高い多くの優れた例があります。この例では、「u @」を有効な電子メールアドレスと見なすことができます。少なくとも、ドメインまたは何かがあるかどうかを評価してくださいドメインのかもしれないユアーズは、私は呼びたいものの一例である、私はわからないんだけど、それはスレッドで最も低い定格の答えははるかにあるとして、あなたがそれを擁護している理由。「積極的に怠惰なコーディング。」。
cazlab

3
@cazlab多分あなたは正しいです。結局、私は反対票を投じられました。あなたとは異なり、私は上記のコードのいずれも簡単にデバッグできるスニペットを示しているとは思いません。私の「積極的に怠惰な」アプローチは、必要に応じて少なくとも改善できます。
Zo72、2012年

3
これは正規表現を使用することとどのように違うのですか?(.+)@(.*)同じことをし、より短い。
スノストーム2012

4
+1-目的がユーザーが少なくとも電子メールアドレスを入力しようとしたことを確認することである場合、電子メールアドレスが電子メールではないことを明確に判断できるかどうかを確認します。素晴らしいソリューション。良い例は、ユーザーのユーザー名を電子メールアドレスにする場合です。ユーザーが「sexy_chick_23」と入力した場合、この正規表現を使用して、電子メールが予期されていることを示すことができます。電子メールのように見えるものを入力したが、そうでない場合、ユーザーは「確認」の電子メールを受け取ることはなく、サインアッププロセスは検証されません。
Chris Dutrow、2012

23

入力したメールアドレスが有効かどうか、またはHTMLを使用していないかどうかを確認してください。

<input type="email"/>

検証用の関数を記述する必要はありません。


4
IE <10はこれをサポートしておらず、Androidのブラウザもサポートしていません。
フランクConijn 2014年

7
賛成票。IE <10は死んだ。
Michael Scheper

19

100%正しい電子メール検証ツールを取得するのは困難です。それを正しくする唯一の実際の方法は、アカウントにテストメールを送信することです。とはいえ、妥当なものを得ていることを確認するのに役立ついくつかの基本的なチェックがあります。

改善すべき点:

newの代わりにRegExp、次のregexpように書き出してみてください。

if (reg.test(/@/))

次に、@記号の後にピリオドがあることを確認し、@sとピリオドの間に文字があることを確認します。


19

これはnode-validatorが行う方法です:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/

14

次のコードをバリデーター関数内で使用します。

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

それ以外の場合はjQueryを使用できます。内部ルールは以下を定義します:

eMailId: {
    required: true,
    email: true
}

1
abc@xyz正規表現で認識されない完全に有効なメールです。
Toto

3
いいえ、ちがいます。正しいメールパターンはsomething@something.somethingで、abc @ xyzはそのパターンに一致しません。そのため、有効なアドレスではありません。
オーキッド


5
ウィキペディアのページはありましたか?TLDは有効なホスト名です。だから、abc@tld有効なメールアドレスです。
Toto

2
電子メールアドレスを検証する唯一の方法は、電子メールを送信して応答を待つことです。これとは別に、アドレスがRFC822に準拠しているかどうかをテストできるURLはmythic-beasts.com/~pdw/cgi-bin/emailvalidateです。abc @ xyzがRFC822の有効なアドレスであることがわかります。
Toto

14

Regexアップデート2018!これを試して

let val = 'email@domain.com';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

typscriptバージョンの完成

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

詳細https://git.io/vhEfc


これは、標準email@domain.comに失敗しました
リックス

1
@RickSこれは単に真実ではありません。もう一度確認してください
malimo

13

TLDの存在をチェックしないソリューションは不完全です。

この質問に対するほとんどすべての回答は、Regexを使用して電子メールアドレスを検証することを推奨しています。Regexは初歩的な検証にのみ適していると思います。電子メールアドレスの検証の確認は、実際には2つの別個の問題であるようです。

1-電子メール形式の検証:電子メールがRFC 5322の電子メールの形式とパターンに準拠しているかどうか、およびTLDが実際に存在するかどうかを確認します。すべての有効なTLDのリストはここにあります

たとえば、アドレスexample@example.cccは正規表現を通過しますが、有効なメールではありません。cccますが、IANAによるトップレベルドメインではないはありません。

2-メールが実際に存在することを確認する:これを行うには、唯一のオプションユーザーにメールを送信することです。


13

メールアドレスを検証するための正規表現

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])+

RFC5322にあなたの正規表現が表示されません:tools.ietf.org/html/rfc5322- 何か間違いはありますか?
KamilKiełczewski2017

「史上最高の正規表現」?おそらくここで何らかの説明をしますか?
connectyourcharger

なぜそれがすべての最良の解決策であると言ったのですか、もう少し説明してください。
nancoder

なぜ「これまでで最高の正規表現」を書いたのか思い出せません。ご迷惑をおかけして申し訳ありません。
Prabhat Kasera

12

ここでは、正規表現を使用して電子メールアドレスを検証することについて非常に良い議論があります。「正規表現を検証する電子メールアドレスの比較

参考のために、JavaScript互換の現在の最上位の式を以下に示します。

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

9
-1ホワイトリストに登録すると、多くのことが望まれます-特に、見逃しました.jobs。さらに、ライブIDNがあります(そのほとんどは、投稿後に正式に承認されたもの.中國です(2010年6月など)。ただし、ほとんどの場合、何年も作業中です)。
Piskvorがビルを去る

2
-1は、一定のトップレベルドメインを使用しません。常に(そして、たとえば2013があるでしょう)新しいtldを追加できます。
miho

100の新しいTLDが確認されています。この回答は有効ではないため、使用しないでください。
Dean Meehan 2014

うん。2011年にそれを言ったので、もう一度言います。「特別な」ドメインのホワイトリストは、承認されるTLDが増えるにつれて、時間の経過とともに悪化するだけです。上記のホワイトリストに一致しない100を超える完全に有効なTLDがあります:en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Piskvorが建物を去った

2015年です。あなたの表現は実用的ではありません。この答えを削除する必要がありますが、この式を配置したすべてのページを修正するのに多分忙しすぎます。正しい?
Eric Leroy

12

どうやら、それだけです:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

10月1日、http: //fightingforalostcause.net/misc/2006/compare-email-regex.phpから取得

しかし、もちろん、それは国際化を無視しています。


12

squirtleとは対照的に、これは複雑なソリューションですが、電子メールを適切に検証する非常に優れた機能果たします。

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

そのように使用してください:

if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }

10
あなたの== true例では必要ありません。
ルークアルダートン2013年

11

正規表現に関する私の知識はそれほど良くありません。そのため、まず単純な正規表現で一般的な構文を確認し、その後、他の関数でより具体的なオプションを確認します。これは最良の技術的解決策ではないかもしれませんが、このように私ははるかに柔軟で高速です。

私が遭遇した最も一般的なエラーは、スペース(特に最初と最後)と、場合によっては二重ドットです。

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true

10
<form name="validation" onSubmit="return checkbae()">
    Please input a valid email address:<br />

    <input type="text" size=18 name="emailcheck">
    <input type="submit" value="Submit">
</form>

<script language="JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>

多分それと一緒に説明または説明を追加した場合?HTMLを実際に表示する必要はないと思います。関係するすべての人々はjavascriptと正規表現です。ジャカスクリプトだけに答えを減らし、それに合わせてちょっとした言い回しを加えたら、賛成票を差し上げます。
bgmCoder 2013年

9

すべての電子メールアドレステストケースに合格するJSの正規表現を探していました。

  • email@example.com 有効なメール

  • firstname.lastname@example.com メールのアドレスフィールドにドットが含まれています

  • email@subdomain.example.com メールにサブドメインのドットが含まれています

  • firstname+lastname@example.com プラス記号は有効な文字と見なされます

  • email@192.0.2.123 ドメインは有効なIPアドレスです

  • email@[192.0.2.123] IPアドレスを囲む角括弧は有効と見なされます

  • “email”@example.com メールに関する引用は有効と見なされます

  • 1234567890@example.com 住所の数字は有効です

  • email@domain-one.example ドメイン名のダッシュは有効です

  • _______@example.com 住所フィールドの下線は有効です

  • email@example.name .name 有効なトップレベルドメイン名です

  • email@example.co.jpトップレベルドメイン名のドットも有効と見なされます(co.jpここの例を使用)

  • firstname-lastname@example.com 住所フィールドのダッシュは有効です

さあ行こう :

http://regexr.com/3f07j

または正規表現:

Regex = /(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@[*[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+]*/

8

ASP.NET MVC内でMicrosoftが提供する正規表現は

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

欠陥がある場合に備えてここに投稿します。ただし、常に自分のニーズにぴったりです。


1
メールの名前部分に+を使用することはできません。
Paul Go
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.