文字列が有効なメールアドレスであることを検証する最もエレガントなコードは何ですか?
文字列が有効なメールアドレスであることを検証する最もエレガントなコードは何ですか?
回答:
これはどうですか?
bool IsValidEmail(string email)
{
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch {
return false;
}
}
明確にするために、質問は特定の文字列が電子メールアドレスの有効な表現であるかどうかを尋ねているのではなく、電子メールアドレスがメッセージを送信するための有効な宛先であるかどうかを尋ねています。そのための唯一の現実的な方法は、確認のためにメッセージを送信することです。
電子メールアドレスは、最初に想定するよりも寛容であることに注意してください。これらはすべて完全に有効な形式です。
ほとんどのユースケースでは、偽の「無効」は、偽の「有効」よりもユーザーと将来の証明にとってはるかに悪いものです。これは、以前この質問への回答として受け入れられていた記事です(その回答は削除されています)。問題を解決するための詳細とその他のアイデアが含まれています。
健全性チェックを提供することは、依然としてユーザーエクスペリエンスにとって良いアイデアです。電子メールアドレスが有効であると想定すると、既知のトップレベルドメインを探し、ドメインのMXレコードを確認し、一般的なドメイン名(gmail.cmo)のスペルエラーを確認するなどして、ユーザーに警告を表示できます。 「はい、私のメールサーバーでは、🌮🍳🎁をメールアドレスとして使用できます。」
ビジネスロジックに例外処理を使用することに関しては、それは避けるべきことだと私は同意します。しかし、これは、便利さと明快さがドグマを上回る可能性があるケースの1つです。
その上、あなたが電子メールアドレスで何か他のことをするなら、それは恐らくそれをMailAddressに変えることを含むでしょう。この正確な関数を使用しない場合でも、おそらく同じパターンを使用する必要があります。また、null、空、無効な形式などのさまざまな例外をキャッチして、特定の種類の障害を確認することもできます。
スチュアートのコメントによると、これは常にtrueを返すのではなく、最終アドレスを元の文字列と比較します。MailAddressはスペースを含む文字列を「表示名」と「アドレス」の部分に解析しようとするため、元のバージョンは誤検知を返していました。
- - 参考文献 - -
System.Net.Mail
クラスを使用してメールを送信する場合の最良の答えです。これは、おそらく.NETを使用している場合と同じです。この種類の検証を使用することを決定したのは、有効なアドレスであっても、メールを送信できない電子メールアドレスを受け入れる意味がないためです。
IsValidEmail("this is not valid@email$com");
これは古い質問ですが、SOで見つけたすべての回答は、最近のものも含めて、これと同じように回答されます。ただし、.Net 4.5 / MVC 4では、System.ComponentModel.DataAnnotationsから[EmailAddress]アノテーションを追加することで、フォームに電子メールアドレス検証を追加できるため、なぜからの組み込み機能を使用できないのか不思議に思っていました。一般的にネット。
これは機能しているようで、私にはかなりエレガントなようです:
using System.ComponentModel.DataAnnotations;
class ValidateSomeEmails
{
static void Main(string[] args)
{
var foo = new EmailAddressAttribute();
bool bar;
bar = foo.IsValid("someone@somewhere.com"); //true
bar = foo.IsValid("someone@somewhere.co.uk"); //true
bar = foo.IsValid("someone+tag@somewhere.net"); //true
bar = foo.IsValid("futureTLD@somewhere.fooo"); //true
bar = foo.IsValid("fdsa"); //false
bar = foo.IsValid("fdsa@"); //false
bar = foo.IsValid("fdsa@fdsa"); //false
bar = foo.IsValid("fdsa@fdsa."); //false
//one-liner
if (new EmailAddressAttribute().IsValid("someone@somewhere.com"))
bar = true;
}
}
EmailAddressAttribute
はSystem.Net.Mail.MailAddress
、たとえばMailAddress
TLDのアドレスを受け入れるよりも許容度が低いことに注意してください。あなたができる限り寛容である必要があるならば、心に留めておくべきちょうど何か。
foo.IsValid(null);
返品にはご注意くださいtrue
。
私は私のために仕事をするこのシングルライナーメソッドを使用します
using System.ComponentModel.DataAnnotations;
public bool IsValidEmail(string source)
{
return new EmailAddressAttribute().IsValid(source);
}
コメントによると、source
(メールアドレス)がnullの場合、これは「失敗」します。
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
、null文字列に対して暗黙的に返すべきではないと思います。それが私が(さらに良い)++バージョンを提案する理由です:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
。私は今行って、さらに良いバージョンの改革派教会を見つけます。
.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])))\.?$";
RegexOptions.IgnoreCase
このパターンでは大文字を明示的に許可しないため、忘れないでください!
私は#1からフィルの答えを受け取り、このクラスを作成しました。次のように呼び出します。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;
}
}
個人的には、@記号が含まれていることを確認する必要があります。キャラクター。さまざまな正しさで使用できる正規表現はたくさんありますが、これらのほとんどは有効なメールアドレスを除外するか、無効なものを通過させると思います。偽のメールアドレスを入力したい場合は、偽のアドレスを入力します。電子メールアドレスが正当であり、その人がその電子メールアドレスを制御していることを確認する必要がある場合は、特別なコード化されたリンクを含む電子メールを送信して、実際のアドレスであることを確認できるようにする必要があります。
私は最良の方法は次のとおりだと思います:
public static bool EmailIsValid(string email)
{
string expression = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
if (Regex.IsMatch(email, expression))
{
if (Regex.Replace(email, expression, string.Empty).Length == 0)
{
return true;
}
}
return false;
}
この静的関数は、一般的なクラスに含めることができます。
短くて正確なコード
string Email = txtEmail.Text;
if (Email.IsValidEmail())
{
//use code here
}
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);
}
最もエレガントな方法は、.Netの組み込みメソッドを使用することです。
これらの方法:
試され、テストされています。これらの方法は、私自身の専門プロジェクトで使用されています。
信頼性が高く高速な内部で正規表現を使用します。
MicrosoftによってC#用に作成されました。ホイールを再発明する必要はありません。
ブールの結果を返します。Trueは、メールが有効であることを意味します。
.Net 4.5以上のユーザー向け
この参照をプロジェクトに追加します。
System.ComponentModel.DataAnnotations
これで、次のコードを使用できます。
(new EmailAddressAttribute().IsValid("youremailhere@test.test"));
使用例
宣言するいくつかのメソッドは次のとおりです。
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());
}
さらに、この例:
;
。代わりに、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;
}
この正規表現は、@マーク以外のものをチェックすることと、奇妙なエッジケースを受け入れることの間の適切なトレードオフであることがわかりました。
^[^@\s]+@[^@\s]+(\.[^@\s]+)+$
少なくとも@マークの周りに何かを配置し、少なくとも通常のドメインを配置します。
bob@companyinternal
?
メールアドレスの検証は、見かけほど簡単ではありません。正規表現だけを使用して電子メールアドレスを完全に検証することは、実際には理論的に不可能です。
この件に関するディスカッションとFParsecを使用したF#実装については、私のブログ投稿をチェックしてください。[/ shameless_plug]
これが私の答えです-Philのソリューションは、「someone@q.com」のような1文字のドメインでは失敗します。信じられないかもしれませんが、これは=)を使用しています(たとえば、centurylinkに移動します)。
Philの答えもPCRE標準でのみ機能するので、C#がそれを採用しますが、JavaScriptが爆破します。JavaScriptには複雑すぎます。したがって、mvc検証属性にPhilのソリューションを使用することはできません。
これが私の正規表現です。MVC検証属性でうまく機能します。
-@の前のすべてが簡略化されているため、少なくともJavaScriptは機能します。Exchangeサーバーが5.1.3を提供しない限り、ここで検証を緩和しても大丈夫です。-@の後のすべては、単一文字のドメイン用に変更された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#は電子メールを受け入れますが、電子メールを送信しようとするとすぐに、Exchangeサーバーが5.1.3ランタイムエラーで爆弾します。
basket@ball
有効な電子メールアドレスとして受け入れられる悪い解決策が正解とそれらすべての賛成票を得たとは信じられません。とにかくありがとう!
メールアドレスが有効かどうかを本当に知りたい場合は、メールエクスチェンジャーにそれを証明するよう依頼してください。正規表現は必要ありません。必要に応じてコードを提供できます。
一般的な手順は次のとおりです。1.メールアドレスにはドメイン名の部分がありますか?(@> 0のインデックス)2. DNSクエリを使用して、ドメインにメールエクスチェンジャーがあるかどうかを確認します。サーバーの応答を解析します。6.これまでにメッセージを作成した場合は、メッセージを終了します。問題はありません。
これは想像できるように、時間的には非常に費用がかかり、SMTPに依存していますが、機能します。
一般的に言えば、メールアドレスを検証するための正規表現は簡単に思いつくものではありません。この記事の執筆時点では、電子メールアドレスの構文は比較的多数の標準に従う必要があり、正規表現内にそれらすべてを実装することは実際には不可能です!
EmailVerify.NETを試してみることを強くお勧めします。これは、すべての電子メールアドレスを検証できる成熟した.NETライブラリです。現在ののIETF標準(RFC 1123、RFC 2821、RFC 2822、RFC 3696、RFC 4291、RFC 5321およびRFC 5322)、関連するDNSレコードをテストし、ターゲットのメールボックスがメッセージを受け入れることができるかどうかを確認し、特定のアドレスが使い捨てかどうかを確認することもできます。
免責事項:私はこのコンポーネントの主要開発者です。
For the simple email like goerge@xxx.com, 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;
}
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;
@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;
}
}
Console.WriteLine(MailAddress("asdf@asdf.").Address);
無効な "asdf @ asdf。"を出力します。
ここには多くの強力な答えがあります。ただし、少し後退することをお勧めします。@Cogwheelが質問https://stackoverflow.com/a/1374644/388267に回答します。それでも、検証される電子メールアドレスの多くが無効である場合、一括検証シナリオではコストがかかる可能性があります。彼のtry-catchブロックに入る前に、少しロジックを使用することをお勧めします。次のコードはRegExを使用して記述できることは知っていますが、新しい開発者が理解するにはコストがかかる可能性があります。これは私の2ペンス相当です。
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;
}
}
@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;
}
}
SanitizeEmail(string email)
、別のメソッドを作成し、そのメソッドの結果を使用して検証してメールを送信することです。
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);
}
メールの文字列が正しい形式か間違った形式かを次の方法で確認します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";
}
}
/「新しいEmailAddressAttribute();」の作成に使用された内部正規表現を使用する .Net4.5のコンポーネント>>> System.ComponentModel.DataAnnotationsを使用。//メールアドレスを検証するには......テスト済みで機能しています。
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/en-us/library/01escwtf(v=vs.110).aspx
私はポイソン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);
}
emailidを識別する簡単な方法が有効かどうか。
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})(\]?)$");
}
カンマ、コメント、Unicode文字、IP(v4)ドメインアドレスの検証に成功したため、私はこの正規表現を使用することになりました。
有効なアドレスは次のとおりです。
"" @ example.org
(コメント)test@example.org
тест@example.org
ტესტი@ example.org
test @ [192.168.1.1]
public const string REGEX_EMAIL = @"^(((\([\w!#$%&'*+\/=?^_`{|}~-]*\))?[^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))(\([\w!#$%&'*+\/=?^_`{|}~-]*\))?@((\[[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,}))$";
Regexを使用しない単純なもの(読みやすさの点で気に入らない):
bool IsValidEmail(string email)
{
string emailTrimed = email.Trim();
if (!string.IsNullOrEmpty(emailTrimed))
{
bool hasWhitespace = emailTrimed.Contains(" ");
int indexOfAtSign = emailTrimed.LastIndexOf('@');
if (indexOfAtSign > 0 && !hasWhitespace)
{
string afterAtSign = emailTrimed.Substring(indexOfAtSign + 1);
int indexOfDotAfterAtSign = afterAtSign.LastIndexOf('.');
if (indexOfDotAfterAtSign > 0 && afterAtSign.Substring(indexOfDotAfterAtSign).Length > 1)
return true;
}
}
return false;
}
例:
IsValidEmail("@b.com") // false
IsValidEmail("a@.com") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a b@c.com") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("a@b.com") // true
IsValidEmail("a@b.c.com") // true
IsValidEmail("a+b@c.com") // true
IsValidEmail("a@123.45.67.89") // true
シンプルであることを意図しているため、スペースが含まれているブラケットドメインのメール(通常は許可)、IPv6アドレスのメールなどのまれなケースには対応していません。
あなたがチェックするあなたの質問への答えはここにあります。
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;
}
}
@Cogwheelの回答に基づいて、SSISおよび「スクリプトコンポーネント」で機能する修正されたソリューションを共有したいと思います。
このコードを適切なメソッドに配置します。
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";
}
}
次に、条件付き分割を使用して、すべての無効なレコードまたは必要な処理をすべて除外できます。