「IsMailValid?」のような単純な結果を得るには、何をお勧めしますか? -> true|false?
- 正規表現を使用するのは保存されますか
- 単純な try/catch で .NET の System...Mail.MailAddressParser を使用する方が良いですか?
速度はそれほど重要ではないので、MailAddressParser を使用しても問題ないと思いますか?
よろしく
ジョン
「IsMailValid?」のような単純な結果を得るには、何をお勧めしますか? -> true|false?
速度はそれほど重要ではないので、MailAddressParser を使用しても問題ないと思いますか?
よろしく
ジョン
あなたの要件が特に速度が必要ではないことを考えると、私は Mail.MailAddressParser を try/catch で使用します。.NET ランタイムが有効な電子メール アドレスとして認識できないものを除外することが保証されており、はるかに簡単です。
良い正規表現はおそらく同じことをしますが、悪い正規表現は偽陽性、偽陰性、またはその両方をもたらします。
速度が要因である場合、例外を処理する際のパフォーマンス コストは別の方向に進みますが、この場合、要件、コードが少なく、コードが読みやすく、パフォーマンス要因のバランスが取れて「機能する」だけです。
説明:
意図したコードは次のようになると思います。
try
{
System.Net.Mail.MailAddress address = new System.Net.Mail.MailAddress(somestring);
}
catch(Exception ex)
{
// handle invalid email addresses here.
}
そして、私の推奨はこの状況のみです。これは、他の方法が機能する場合に例外を使用しないというベスト プラクティスに対する意図的な例外であり、パフォーマンスが要因ではないという明示的な声明のためにのみ提案されています。
定期的に障害が発生することが予想される場合に例外を使用することは、.NETのベストプラクティスに反します。その理由は、例外は非常に高価であるためです。
コンパイル済みモードで正規表現を使用して、不正な電子メールアドレスを除外します。
このようなものは完全に機能します:
Private Function ValidEmail(ByVal Email As String) As Boolean
If Text.RegularExpressions.Regex.IsMatch(Trim(Email), "^\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b$", RegexOptions.IgnoreCase Or RegexOptions.Compiled) = False Then
Return False
Else
Return True
End If
End Function