web-dev-qa-db-ja.com

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

私はこのように私のメールアドレスを検証する正規表現を得ました:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

これは完璧に機能しますが、1つの電子メールしか入力できません。今、私はそれを拡張して、複数のメールアドレスを(たとえば、MS Outlookのように)セミコロンをメールスプリッターとして追加できるようにしたかったのです。

[email protected];[email protected];[email protected]

今私はこれを検索して見つけました:

([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}(;|$))

これは1つの点で機能しますが、悲しいことにrequiresセミコロンがメールの最後にあります。

[email protected];

これは、ユーザーが電子メールを1つだけ入力する場合には望みません。

上記の正規表現(最初の正規表現)を拡張して、セミコロンで分割しながら複数のメールアドレスを追加できるようにするにはどうすればよいですか?

25
SeToY

これは元の表現で、セミコロンと(オプションで)セミコロンのほかにスペースで区切られた複数の電子メールを許可するように変更されています。また、セミコロンで終わらない単一のメールアドレスを許可します。

これにより、空白のエントリが許可されます(電子メールアドレスなし)。最後の*を+に置き換えると、少なくとも1つのアドレスが必要になります。

(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*

セミコロン以外にカンマを許可する必要がある場合は、このグループを変更できます。

(\s*;\s*|\s*$)

これによって:

(\s*(;|,)\s*|\s*$)

重要な注意:マーティンのコメントにあるように、正しいメールアドレスリストの前後に追加のテキストがあっても、検証は失敗しません。したがって、「メールサーチャー」として機能します。バリデータとして機能させるには、正規表現の先頭に^を追加し、末尾に$を追加する必要があります。これにより、式がすべてのテキストと一致するようになります。したがって、完全な正規表現は次のようになります。

^(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*$

次のように、\s*の後に余分な^を追加して、リストの先頭の空白を許容できます。つまり単に^\s*ではなく^を含めます。式は、末尾の空白をそのまま許容しています。

57
JotaBe

古い投稿-同じRegExが必要でした。受け入れられた答えは私にはうまくいきませんでしたが、これはうまくいきました。

^(|([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$

this post から取得しましたが、受け入れられた回答も機能しませんでしたが、リンク内のRegexは投稿内で機能しました。

[email protected]-検証

[email protected];[email protected]-検証

[email protected];-検証しません

empty string-検証

空の文字列に対して検証する場合は、正規表現の先頭にある|を削除します

5
Rob Scott

これをお試しください

^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
3
PraveenVenu

セミコロンで分割し、既存の正規表現を使用して各潜在的な電子メールアドレスを検証しないのはなぜですか?巨大な正規表現を1つ書くのは非常に難しく、メンテナンスの悪夢だと私は思います。

2
Brian Agnew

古い正規表現の本では、allの有効な電子メールアドレスに一致する正規表現を書くことはできないと述べていました(ただし、近づくことはできます)。

これはウェブサイトです 正規表現とメールアドレスを扱います。

文字列を;,の境界で分割し、正規表現で有効/無効になっていないか各メールアドレスを個別に確認することをお勧めします。

1
Uwe Keim

ドメイン名は実際にはもっと複雑です。たとえば、ほとんどのTLDは現在 Unicodeドメイン名 を使用していますが、これはヨーロッパでは非常に一般的です。電子メールアドレスmailtest@пример.испытаниеを検討してください。これは実際には完全に有効です(ただし、常に 古い形式に変換できます [email protected] )。これは、ドメイン名に対して有効な文字が有効でない文字を定義する方がおそらく簡単であることを意味します。 ICANNs を参照してください。

さらに、TLDも厳密に定義したセットの一部ではありません。有効なTLDの IANAsリストを参照してください 。たとえば、example @ example.travelは有効なメールアドレスです。

要するに、限定された特別なケースを扱っているのでない限り、メールアドレスを検証するために、確立されたサードパーティのライブラリを使用することを検討してください。

元の質問では、妥当な区切り文字(「、」、「;」)で分割し、空白文字を削除し(少なくともユーザー入力を処理する場合)、各エントリを検証する前処理段階をお勧めします。

1
Krumelur

以下は私の解決策であり、私にとって期待どおりに機能しました:

      var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6}))*$/i);
  var emailText = $('#email').val();

  if (!emailReg.test(emailText)) {
      alert('Wrong Email Address\Addresses format! Please reEnter correct format');
        return false;
    }
}
0
Qasim Bataineh

これは、正規表現を使用せずにこれを行う簡単なプログラムです。実際には正規表現を使用しますが、.phpがこれを行うためにどのように見えるかについて心配する必要はありません。

public function test_reg()

{

   $email_list = '';

        $array = explode(";",$email_list);

        foreach ($array as $value)
         {
            $value;

            if (!filter_var($value, FILTER_VALIDATE_EMAIL) === false)
             {
                 $msg =  "Email List Contains  valid email addresses.";
              } 
            else
             {
                 $msg ="Your Email list contains an invalid email at. &nbsp&nbsp &nbsp".$value;
                 break;
             }  
         }

                echo $msg;



}

メールはセミコロンで区切る必要があります。

0
user6817600

私が日々書いたもの。基本的な電子メール検証は 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])(;)?)+$

とメールを照合します。セパレーター

もっとセパレータが欲しい、スワップ(;)? [;、|]とは? []括弧内。

0
Shuffler

これは非常に古い質問ですが、C#コードを共有したいと思っていました。

セミコロンで解析してから、各メールを個別に確認することにしました。

string toAddress = "[email protected];[email protected];";
Regex rgx = new Regex(
    @"^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$");

List<string> emailArray = new List<string>();

if(toAddress != null && toAddress != "")
{
    if (toAddress.IndexOf(";") != -1)
    {
        emailArray = toAddress.Replace(" ","").Split(';').ToList();
    }
    else
    {
        emailArray.Add(toAddress);
    }

    foreach (string email in emailArray)
    {
        if (rgx.IsMatch(email ?? ""))
        {
            SendEmail(email, subject, body);
        }
    }
}
0
Jacob Morris