web-dev-qa-db-ja.com

電子メールアドレスを検証するためのC#コード

文字列が有効な電子メールアドレスであることを検証するための最もエレガントなコードは何ですか?

379
leora

これはどうですか?

bool IsValidEmail(string email)
{
    try {
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch {
        return false;
    }
}

明確にするために、質問は、特定の文字列が電子メールアドレスの有効な表現であるかどうかを尋ねることであり、電子メールアドレスがメッセージを送信するための有効な宛先であるかどうかではありません。そのために、唯一の本当の方法は確認のためにメッセージを送ることです。

電子メールアドレスは、最初に想定していたよりも寛容であることに注意してください。これらはすべて完全に有効な形式です。

ほとんどのユースケースでは、誤った「無効」は、誤った「有効」よりも、ユーザーおよび将来の校正にとってはるかに悪くなります。これは、この質問に対する 以前は受け入れられた回答であった記事 です(その回答はその後削除されています)。それは問題を解決する方法のより多くの詳細と他のいくつかの考えを持っています。

健全性チェックを提供することは、まだユーザーエクスペリエンスにとっては良い考えです。電子メールアドレスが有効であると仮定すると、既知のトップレベルドメインの検索、MXレコードのドメインの確認、一般的なドメイン名(gmail.cmo)からのスペルミスの確認などができます。 「はい、私のメールサーバーは本当に????????????をEメールアドレスとして許可します。」と言う機会があります。


ビジネスロジックに例外処理を使用することに関しては、私はそれが避けられるべきことであると思います。しかし、これは利便性と明快さが教義を上回るかもしれないケースの一つです。

その上、あなたがEメールアドレスを使って何か他のことをするならば、それはおそらくそれをMailAddressに変えることを含むでしょう。たとえあなたがこの正確な関数を使わなくても、おそらく同じパターンを使いたくなるでしょう。 さまざまな例外 :null、空、または無効な形式をキャッチして、特定の種類の失敗を確認することもできます。


Stuartのコメントによると、これは常にtrueを返すのではなく、最終アドレスを元の文字列と比較します。 MailAddressは、スペースを含む文字列を "表示名"と "アドレス"の部分に解析しようとします。そのため、元のバージョンは誤検知を返していました。


- - 参考文献 - -

System.Net.Mail.MailAddressのドキュメント

有効なEメールアドレスを構成するものの説明

653
Cogwheel

これは古い質問ですが、最近のものも含めてSOで見つけたすべての答えは、この質問と同じように答えられます。しかし、.Net 4.5/MVC 4ではSystem.ComponentModel.DataAnnotationsから[EmailAddress]アノテーションを追加することでフォームにEメールアドレス検証を追加できるので、なぜ私はから単に組み込み機能を使用できないのか疑問に思いました。一般的にネット。

これはうまくいくように思えますし、私にはかなりエレガントに思えます。

using System.ComponentModel.DataAnnotations;

class ValidateSomeEmails
{
    static void Main(string[] args)
    {
        var foo = new EmailAddressAttribute();
        bool bar;
        bar = foo.IsValid("[email protected]");         //true
        bar = foo.IsValid("[email protected]");       //true
        bar = foo.IsValid("[email protected]");     //true
        bar = foo.IsValid("[email protected]");      //true

        bar = foo.IsValid("fdsa");                          //false
        bar = foo.IsValid("[email protected]");                         //false
        bar = foo.IsValid("[email protected]");                     //false
        bar = foo.IsValid("[email protected]");                    //false

        //one-liner
        if (new EmailAddressAttribute().IsValid("[email protected]"))
            bar = true;    
    }
}
209
imjosh

私はこのシングルライナー方式を使用しています。

using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
    return new EmailAddressAttribute().IsValid(source);
}

コメントによれば、これはsource(Eメールアドレス)がnullの場合、 "失敗"します。

public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
42
Manik Arora

.net 4.5が追加された System.ComponentModel.DataAnnotations.EmailAddressAttribute

EmailAddressAttributeのソースを参照できます 、これは内部で使用されている正規表現です。

const string pattern = @"^((([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])))\.?$";
38
Chad Grant

私は#1からPhilの答えを取り、このクラスを作成しました。これを次のように呼び出します。bool isValid = Validator.EmailIsValid(emailString);

これがクラスです:

using System.Text.RegularExpressions;

public static class Validator
{

    static Regex ValidEmailRegex = CreateValidEmailRegex();

    /// <summary>
    /// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
    /// </summary>
    /// <returns></returns>
    private static Regex CreateValidEmailRegex()
    {
        string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
            + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
            + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

        return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
    }

    internal static bool EmailIsValid(string emailAddress)
    {
        bool isValid = ValidEmailRegex.IsMatch(emailAddress);

        return isValid;
    }
}
33

個人的には、@記号があることを確認する必要があります。キャラクター。あなたがさまざまな正確さを使うことができる多くの正規表現があります、しかし私はこれらのほとんどが有効なEメールアドレスを除外するか、または無効なものを通すと思います。人々が偽のEメールアドレスを入れたい場合、彼らは偽のものを入れます。あなたがそのEメールアドレスが合法であること、そしてその人がそのEメールアドレスを管理していることを確かめる必要があるならば、あなたは彼らがそれが本当のアドレスであることを確かめることができるように特別なコード化リンクでEメールを送る必要があります。

28
Kibbee

私は最善の方法は次のようになると思います:

    public static bool emailIsValid(string email)
    {
        string expresion;
        expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
        if (Regex.IsMatch(email, expresion))
        {
            if (Regex.Replace(email, expresion, string.Empty).Length == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

この静的関数を一般クラスに含めることができます。

14
Poyson1

最もエレガントな方法は、.NETの組み込みメソッドを使用することです。

これらの方法:

  • 試してテストされています。これらの方法は私自身のプロのプロジェクトで使われています。

  • 内部で正規表現を使用してください。これは信頼性が高く高速です。

  • C#のためにマイクロソフトによって作られました。ホイールを作り直す必要はありません。

  • ブール結果を返します。 Trueならメールは有効です。

.Net 4.5以降のユーザー向け

この参照をプロジェクトに追加します。

System.ComponentModel.DataAnnotations

今、あなたは以下のコードを使うことができます:

(new EmailAddressAttribute().IsValid("[email protected]"));

使用例

宣言する方法は次のとおりです。

protected List<string> GetRecipients() // Gets recipients from TextBox named `TxtRecipients`
{
    List<string> MethodResult = null;

    try
    {
        List<string> Recipients = TxtRecipients.Text.Replace(",",";").Replace(" ", "").Split(';').ToList();

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

        foreach (string Recipient in RecipientsCleaned)
        {
            if (!String.IsNullOrWhiteSpace(Recipient))
            {
                RecipientsNoBlanks.Add(Recipient);

            }

        }

        MethodResult = RecipientsNoBlanks;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();
    }

    return MethodResult;

}


public static bool IsValidEmailAddresses(List<string> recipients)
{
    List<string> InvalidAddresses = GetInvalidEmailAddresses(recipients);

    return InvalidAddresses != null && InvalidAddresses.Count == 0;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!(new EmailAddressAttribute().IsValid(Recipient)) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch//(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

...そしてそれらが実際に動作していることを示すコード:

List<string> Recipients = GetRecipients();

bool IsValidEmailAddresses = IsValidEmailAddresses(Recipients);

if (IsValidEmailAddresses)
{
    //Emails are valid. Your code here

}
else
{
    StringBuilder sb = new StringBuilder();

    sb.Append("The following addresses are invalid:");

    List<string> InvalidEmails = GetInvalidEmailAddresses(Recipients);

    foreach (string InvalidEmail in InvalidEmails)
    {
        sb.Append("\n" + InvalidEmail);

    }

    MessageBox.Show(sb.ToString());

}

さらに、この例:

  • 単一の文字列が0個、1個、または多数の電子メールアドレスをセミコロン;で表すために使用されるため、仕様を超えて拡張されます。
  • EmailAddressAttributeオブジェクトのIsValidメソッドの使用方法を明確に示しています。

4.5未満の.Netバージョンを使用している場合は、

.Net 4.5が利用できない状況では、私は以下の解決策を使用します。

具体的には、

public static bool IsValidEmailAddress(string emailAddress)
{
    bool MethodResult = false;

    try
    {
        MailAddress m = new MailAddress(emailAddress);

        MethodResult = m.Address == emailAddress;

    }
    catch //(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}

public static List<string> GetInvalidEmailAddresses(List<string> recipients)
{
    List<string> MethodResult = null;

    try
    {
        List<string> InvalidEmailAddresses = new List<string>();

        foreach (string Recipient in recipients)
        {
            if (!IsValidEmail(Recipient) && !InvalidEmailAddresses.Contains(Recipient))
            {
                InvalidEmailAddresses.Add(Recipient);

            }

        }

        MethodResult = InvalidEmailAddresses;

    }
    catch //(Exception ex)
    {
        //ex.HandleException();

    }

    return MethodResult;

}
13

短く正確なコード

public static bool IsValidEmail(this string email)
        {
            string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

            var regex = new Regex(pattern, RegexOptions.IgnoreCase);

            return regex.IsMatch(email);
        }
8
Naveen Soni

正直に言うと、プロダクションコードでは、@シンボルをチェックするのが最善です。

私は完全に電子メールを検証する場所にはいません。それが本当に有効であるかどうか、私がどのように見ているか知っていますか?それが送られたならば。そうでなかったら、それは悪いです、そうであれば、人生は良いです。私が知る必要があるのはこれだけです。

6
Noon Silk

この正規表現は、@マーク以外のものをチェックすることと、奇妙なEdgeのケースを受け入れることとの間の良いトレードオフであると思います。

^[^@\s][email protected][^@\s]+(\.[^@\s]+)+$

少なくとも@マークの周りに何かを置き、少なくとも普通のドメインを置くようにします。

6
Matthew Lock

これが私の答えです - Philのソリューションは、 "[email protected]"のような一文字ドメインでは失敗します。信じられないかもしれませんが、これは=)を使用しています(たとえば、センチュリリンクに移動します)。

Philの答えもPCRE標準でしか動かないでしょう…それでC#がそれを取りますが、javascriptは爆弾を投げかけます。 JavaScriptには複雑すぎます。ですから、Philのソリューションをmvc検証属性に使用することはできません。

これが私の正規表現です。それはMVC検証属性とうまく働きます。
- @より前の部分はすべて簡略化されているので、少なくともjavascriptは機能します。交換サーバーが私に5.1.3を与えない限り、私はここで妥当性確認を緩めても大丈夫です。 - @の後に続くものはすべて、1文字ドメイン用に変更されたPhilのソリューションです。

public const string EmailPattern =
        @"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";

System.net.mail MailMessage()を使用することを提案している人々にとって、それは柔軟な方法です。確かに、C#は、電子メールを受け入れますが、その後、あなたが電子メールを送信しようとするとすぐに交換サーバーが5.1.3ランタイムエラーで爆破されます。

4
Ralph N

電子メールアドレスの検証は、見かけほど簡単ではありません。正規表現だけで電子メールアドレスを完全に検証することは、理論的には不可能です。

この件についての議論とFParsecを使ったF#の実装については私の ブログ投稿 それをチェックしてください。 [/ shameless_plug]

4

あなたが本当にそして私が本当にEメールアドレスが有効であるかどうか知りたいのであれば...それを証明するようにメールエクスチェンジャに依頼しなさい、正規表現は必要ない。要求があれば私はコードを提供することができます。

一般的な手順は次のとおりです。1.電子メールアドレスにドメイン名の部分がありますか。 DNSインデックスを使用して、ドメインにメールエクスチェンジャがあるかどうかを確認します。3.メールエクスチェンジャへのTCP接続を開きます。サーバーの応答を解析します。あなたがこれまでにそれを作った場合、メッセージを終了、すべてが良いです。

想像できるように、これは非常に高価な時間の賢い方法であり、SMTPに依存していますが、うまくいきます。

3
Joe Caffeine

@Cogwheelからの最も投票された回答は最良の回答ですが、私はtrim()文字列メソッドを実装しようとしたので、文字列の最初から最後まですべてのユーザーの空白を削除します。完全な例については、以下のコードを確認してください -

bool IsValidEmail(string email)
{
    try
    {
        email = email.Trim();
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    }
    catch
    {
        return false;
    }
}
2
Liakat Hossain
For the simple email like [email protected], below code is sufficient. 

 public static bool ValidateEmail(string email)
        {
            System.Text.RegularExpressions.Regex emailRegex = new System.Text.RegularExpressions.Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
            System.Text.RegularExpressions.Match emailMatch = emailRegex.Match(email);
            return emailMatch.Success;
        }
2
user2211290

一般的に言って、電子メールアドレスを検証するための正規表現は思いつくのが簡単なことではありません。これを書いている時点では、Eメールアドレスの構文は比較的多数の標準に従う必要があり、正規表現内にそれらのすべてを実装することは実際には不可能です。

EmailVerify.NET 、現在のIETF規格(RFC 1123、RFC 2821、RFC 2822、RFC 3696)の all に続く電子メールアドレスを検証できる成熟した.NETライブラリを試すことを強くお勧めします。 RFC 4291、RFC 5321、およびRFC 5322)は、関連するDNSレコードをテストし、ターゲットメールボックスがメッセージを受け付けることができるかどうかを確認し、指定されたアドレスが使い捨てかどうかを判断することさえできます。

免責事項:私はこのコンポーネントの主任開発者です。

2
Efran Cobisi

ここにはたくさんの強力な答えがあります。しかし、一歩後退することをお勧めします。 @Cogwheelが質問に答えます https://stackoverflow.com/a/1374644/388267 。それにもかかわらず、検証されている電子メールアドレスの多くが無効である場合、一括検証シナリオではコストがかかる可能性があります。彼のtry-catchブロックに入る前に、少し論理を使うことをお勧めします。私は以下のコードがRegExを使って書かれるかもしれないことを知っています、しかしそれは新しい開発者にとって理解するのに費用がかかるかもしれません。これは私のツーペンス価値がある:

    public static bool IsEmail(this string input)
    {
        if (string.IsNullOrWhiteSpace(input)) return false;

        // MUST CONTAIN ONE AND ONLY ONE @
        var atCount = input.Count(c => c == '@');
        if (atCount != 1) return false;

        // MUST CONTAIN PERIOD
        if (!input.Contains(".")) return false;

        // @ MUST OCCUR BEFORE LAST PERIOD
        var indexOfAt = input.IndexOf("@", StringComparison.Ordinal);
        var lastIndexOfPeriod = input.LastIndexOf(".", StringComparison.Ordinal);
        var atBeforeLastPeriod = lastIndexOfPeriod > indexOfAt;
        if (!atBeforeLastPeriod) return false;

        // CODE FROM COGWHEEL'S ANSWER: https://stackoverflow.com/a/1374644/388267 
        try
        {
            var addr = new System.Net.Mail.MailAddress(input);
            return addr.Address == input;
        }
        catch
        {
            return false;
        }
    }
2
CarneyCode

Eメールの文字列がSystem.Text.RegularExpressionsで正しい形式か間違った形式かを確認します。

    public static bool IsValidEmailId(string InputEmail)
    {
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
        Match match = regex.Match(InputEmail);
        if (match.Success)
            return true;
        else
            return false;
    }

    protected void Email_TextChanged(object sender, EventArgs e)
    {
        String UserEmail = Email.Text;
        if (IsValidEmailId(UserEmail))
        {
            Label4.Text = "This email is correct formate";
        }
        else
        {
            Label4.Text = "This email isn't correct formate";
        }
    }
2
RKTUXYN

「new EmailAddressAttribute();」の作成に使用された内部正規表現を使用します。 System.ComponentModel.DataAnnotationsを使用した.Net4.5 >>>内のコンポーネント。 //電子メールアドレスを検証するには......テスト済みで動作中。

public bool IsEmail(string email)
{
    if (String.IsNullOrEmpty(email))
    {   return false;  }
    try
    {
        Regex _regex = new Regex("^((([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\\u" +
                "FDF0-\\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-\\uFF" +
                "EF])))\\.?$", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
        return _regex.IsMatch(email);
    }
    catch (RegexMatchTimeoutException)
    {
        return false;
    }
}

また、これを使うことができます:

http://msdn.Microsoft.com/ja-jp/library/01escwtf(v=vs.110).aspx

1
Aina Ademola C

これはあなたがチェックするあなたの質問に対する答えです。

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class RegexUtilities
{    
   public bool IsValidEmail(string strIn)
   {
       if (String.IsNullOrEmpty(strIn))
       {
          return false;

       }

       // Use IdnMapping class to convert Unicode domain names.

       try 
       {
          strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper, RegexOptions.None, TimeSpan.FromMilliseconds(200));

       }
       catch (RegexMatchTimeoutException) 
       {
           return false;

       }

       if (invalid)
       {
           return false;

       }

       // Return true if strIn is in valid e-mail format.    

       try 
       {
          return Regex.IsMatch(strIn, @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|       [-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$", RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));

       }
       catch (RegexMatchTimeoutException) 
       {
          return false;

       }

   }


   private string DomainMapper(Match match)
   {
      // IdnMapping class with default property values.

      IdnMapping idn = new IdnMapping();

      string domainName = match.Groups[2].Value;

      try 
      {
         domainName = idn.GetAscii(domainName);

      }
      catch (ArgumentException) 
      {
         invalid = true;

      }

      return match.Groups[1].Value + domainName;

   }

}
1
Parsa Karami

C#ではなくjsの正規表現にカルチャの問題があります。そのため、電子メールチェックのためにUSモードで正規表現を使用する必要があります。 ECMAScriptモードを使用しない場合、あなたの言語の特殊文字は正規表現を含むA-Zに含まれます。

Regex.IsMatch(email, @"^([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})(\]?)$", RegexOptions.ECMAScript)
0
mkysoft

私は電子メールが有効かどうかをチェックする機能を書きました。ほとんどの場合、私にとってはうまくいっているようです。

結果:

[email protected] => FALSE
[email protected] => FALSE
[email protected] => FALSE
[email protected] => FALSE
[email protected] => FALSE
[email protected] => FALSE
[email protected] => FALSE
[email protected] => FALSE
[email protected]@asd.cm => FALSE
[email protected] => FALSE
[email protected] => FALSE

[email protected] => TRUE
[email protected] => TRUE
[email protected] => TRUE
[email protected] => TRUE

コード:

    private bool IsValidEmail(string email)
    {
        bool valid = false;
        try
        {
            var addr = new System.Net.Mail.MailAddress(email);
            valid = true;
        }
        catch
        {
            valid = false;
            goto End_Func;
        }

        valid = false;
        int pos_at = email.IndexOf('@');
        char checker = Convert.ToChar(email.Substring(pos_at + 1, 1));
        var chars = "qwertyuiopasdfghjklzxcvbnm0123456789";
        foreach (char chr in chars)
        {
            if (checker == chr)
            {
                valid = true;
                break;
            }
        }
        if (valid == false)
        {
            goto End_Func;
        } 

        int pos_dot = email.IndexOf('.', pos_at + 1);
        if(pos_dot == -1)
        {
            valid = false;
            goto End_Func;
        }

        valid = false;
        try
        {
            checker = Convert.ToChar(email.Substring(pos_dot + 1, 1));
            foreach (char chr in chars)
            {
                if (checker == chr)
                {
                    valid = true;
                    break;
                }
            }
        }
        catch
        {
            valid = false;
            goto End_Func;
        }

        Regex valid_checker = new Regex(@"^[[email protected]]*$");
        valid = valid_checker.IsMatch(email);
        if (valid == false)
        {
            goto End_Func;
        }

        List<int> pos_list = new List<int> { };
        int pos = 0;
        while (email.IndexOf('_', pos) != -1)
        {
            pos_list.Add(email.IndexOf('_', pos));
            pos = email.IndexOf('_', pos) + 1;
        }

        pos = 0;
        while (email.IndexOf('.', pos) != -1)
        {
            pos_list.Add(email.IndexOf('.', pos));
            pos = email.IndexOf('.', pos) + 1;
        }

        pos = 0;
        while (email.IndexOf('-', pos) != -1)
        {
            pos_list.Add(email.IndexOf('-', pos));
            pos = email.IndexOf('-', pos) + 1;
        }

        int sp_cnt = pos_list.Count();
        pos_list.Sort();
        for (int i = 0; i < sp_cnt - 1; i++)
        {
            if (pos_list[i] + 1 == pos_list[i + 1])
            {
                valid = false;
                break;
            }

            if (pos_list[i]+1 == pos_at || pos_list[i]+1 == pos_dot)
            {
                valid = false;
                break;
            }
        }

        if(valid == false)
        {
            goto End_Func;
        }

        if (pos_list[sp_cnt - 1] == email.Length - 1 || pos_list[0] == 0)
        {
            valid = false;
        }

    End_Func:;
        return valid;
    }
0
Louis Tran

@Cogwheelの答えに基づいて、私はSSISと "スクリプトコンポーネント"のために働く修正された解決策を共有したいです。

  1. 「スクリプトコンポーネント」をデータフロー接続に配置してから開きます。
  2. [入力列]セクションで、電子メールアドレスを含むフィールドを[ReadWrite]に設定します(例では 'fieldName')。
  3. [スクリプト]セクションに戻り、[スクリプトの編集]をクリックします。それからコードが開いた後待つ必要があります。
  4. このコードを正しい方法で配置します。

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        string email = Row.fieldName;
    
        try
        {
            System.Net.Mail.MailAddress addr = new System.Net.Mail.MailAddress(email);
            Row.fieldName= addr.Address.ToString();
        }
        catch
        {
            Row.fieldName = "WRONGADDRESS";
        }
    }
    

その後、条件付き分割を使用して、無効なレコードをすべて除外したり、必要なことをすべて除外したりできます。

0
user3772108

別の正規表現マッチの答え:

   /// <summary>
   /// Validates the email input
   /// </summary>
   internal static bool ValidateEmail(string _emailAddress)
   { 

        string _regexPattern = @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@"
                + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
                + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"
                + @"([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$";

        return (string.IsNullOrEmpty(_emailAddress) == false && System.Text.RegularExpressions.Regex.IsMatch(_emailAddress, _regexPattern))
            ? true
            : false;
    }
0
karsnen

電子メールIDを識別する簡単な方法は有効かどうかです。

public static bool EmailIsValid(string email)
{
        return Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
0
Amit Gorvadiya

コンマ、コメント、Unicode文字、IP(v4)ドメインアドレスの検証に成功したので、この正規表現を使用しました。

有効な住所は次のとおりです。

"" @ example.org

(comment)[email protected]

тест@example.org

@ example.org

テスト@ [192.168.1.1]

 public const string REGEX_EMAIL = @"^(((\([\w!#$%&'*+\/=?^_`{|}~-]*\))?[^<>()[\]\\.,;:\[email protected]\""]+(\.[^<>()[\]\\.,;:\[email protected]\""]+)*)|(\"".+\""))(\([\w!#$%&'*+\/=?^_`{|}~-]*\))[email protected]((\[[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,}))$";
0
d.popov

@Cogwheelの回答を少し修正しました

public static bool IsValidEmail(this string email)
{
  // skip the exception & return early if possible
  if (email.IndexOf("@") <= 0) return false;

  try
  {
    var address = new MailAddress(email);
    return address.Address == email;
  }
  catch
  {
    return false;
  }
}
0
waitforit

FluentValidation を使用している場合は、これと同じくらい簡単なものを書くことができます。

public cass User
{
    public string Email { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(x => x.Email).EmailAddress().WithMessage("The text entered is not a valid email address.");
    }
}

// Validates an user. 
var validationResult = new UserValidator().Validate(new User { Email = "açflkdj" });

// This will return false, since the user email is not valid.
bool userIsValid = validationResult.IsValid;
0
Ulysses Alves

私はPoyson 1の答えを次のように説明しました。

public static bool IsValidEmailAddress(string candidateEmailAddr)
{
    string regexExpresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    return (Regex.IsMatch(candidateEmailAddr, regexExpresion)) && 
           (Regex.Replace(candidateEmailAddr, regexExpresion, string.Empty).Length == 0);
}
0
B. Clay Shannon
private static bool IsValidEmail(string emailAddress)
{
    const string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
                                     + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
                                     + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";

    return new Regex(validEmailPattern, RegexOptions.IgnoreCase).IsMatch(emailAddress);
}
0
ErwanLent