5

私はから良い電子メール検証正規表現を取得しました: 電子メールの正規表現

    public static void Main(string[] args)
    {
        string value = @"cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc";
        var regex = new Regex(
            @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$",
            RegexOptions.Compiled);
        var x = regex.Match(value); // Hangs here !?!
        return;
    }

ほとんどの場合は機能しますが、上記のコードがハングし、100%CPUが消費されます...私はW8メトロアプリでテストしました。標準の.Net4.5アプリ。

なぜこれが発生するのか、そしてハングしない優れた電子メール検証REGEXがあるかどうか、またはこれを修正する方法があるかどうかを誰かに教えてもらえますか?

どうもありがとう、ジョン

4

3 に答える 3

15

ハングする理由の説明:壊滅的なバックトラック

正規表現の重要な部分を単純化しましょう。

(\w*[0-9a-zA-Z])*@

あなたが持っている

  • \w*次の部分と同じ文字に一致するオプションの部分である[0-9a-zA-Z]ため、2つの組み合わせは本質的に次のように変換されます。\w+
  • ネストされた数量詞:(\w+)*

これは、与えられたs = "cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc"場合、正規表現のこの部分は、以下が見つからない場合に不一致を決定する前に、 s(の番号が)のすべての可能な順列をチェックする必要があることを意味します。2**(len(s)-1)@

正規表現を使用して電子メールアドレスを検証することはできないため(仕様にはコーナーケースが多すぎる)、通常は次のことを行うのが最適です。

  • 最小限の正規表現チェックを実行します(^.*@.*$
  • パーサーを使用して有効性をチェックします(@ Fake.It.Til.U.Make.Itの提案など)
  • それに電子メールを送ってみてください-一見有効なアドレスでさえ偽物である可能性があるので、とにかくこれをしなければならないでしょう。

完全を期すために、アトミックグループを使用してバックトラックの問題を回避できます。

var regex = new Regex(
    @"^([0-9a-zA-Z](?>[-.\w]*[0-9a-zA-Z])*@(?>[0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$",
    RegexOptions.Compiled);
于 2012-10-26T13:30:13.853 に答える
4

regexメールの検証には絶対に使用しないでください。

MailAddressクラスを使用して検証できます

try 
{
    address = new MailAddress(address).Address;
   //address is valid
} 
catch(FormatException)
{
    //address is invalid
}
于 2012-10-26T13:22:48.617 に答える
1

正規表現の[-。\w]が原因だと思います。これを使用してみてください:

^[a-zA-Z0-9_-]+(?:\.[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})(\]?)$

また、.net 4.5では、EmailAttributeが使用可能になっているはずですが、よくわかりません。

于 2012-10-26T13:25:14.400 に答える