web-dev-qa-db-ja.com

C#での電子メール検証に最適な正規表現

電子メールアドレスを検証することを目的とするさまざまなプログラミング言語の多数の正規表現を見てきました。問題の表現は特定のケースでは機能せず、厳しすぎるか寛容すぎるというコメントを多く見ました。私が探しているのは、決定的なC#コードで使用できる正規表現です。

私が見つけた最高のものはこれです

^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$

もっと良いものはありますか?

34
Sachin Kainth

メールアドレス: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])?

使用法 :

bool isEmail = Regex.IsMatch(emailString, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
139
PaRiMaL RaJ

最初のオプション(スローキャッチのために悪いが、MSはあなたのために動作します):

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

2番目のオプションは RFCを読むまで電子メールアドレスを検証する方法を知っていました および RFC仕様

20
Piotr Stapp

このC#関数は、正規表現を使用して、渡された電子メールアドレスが構文的に有効かどうかを評価します。

public static bool isValidEmail(string inputEmail)
{
   string strRegex = @"^([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})(\]?)$";
   Regex re = new Regex(strRegex);
   if (re.IsMatch(inputEmail))
    return (true);
   else
    return (false);
}
12
Obama

2019の回答を更新しました。

正規表現オブジェクトは、マッチング関数に対してスレッドセーフです。それを知っていて、いくつかのパフォーマンスオプションや文化的/言語的な問題があるので、この簡単なソリューションを提案します。

public static Regex _regex = new Regex(
    @"^([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.CultureInvariant | RegexOptions.Singleline);

public static bool IsValidEmailFormat(string emailInput)
{
    return _regex.IsMatch(emailInput);
}

正規表現の代替構成:

public static Regex _regex = new Regex(
    @"^([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.CultureInvariant | RegexOptions.Compiled);

コンパイルは、たとえば本の構文解析など、大きな文字列の一致でのみ高速になることがわかりました。単純なメールマッチングは、Regexに解釈させるだけで高速です。

スレッドセーフティと正規表現
正規表現のベストプラクティス

1
HouseCat

RegExを使用した検証の前後に、追加の検証のためにnew EmailAddressAttribute().IsValid(emailTxt)を提案したいと思います。

EmailAddressAttributeSystem.ComponentModel.DataAnnotations namespaceの一部であることに注意してください。

0
jitin14