0

私は現在、次の正規表現を使用するAsp.net、c#、Mvc2を使用してシステムを構築しています。

^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$

これは、「有効な」電子メールアドレス形式を検証する電子メール正規表現です。私のコードは次のとおりです。

if (!Regex.IsMatch(model.Email, @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$"))
                ModelState.AddModelError("Email", "The field Email is invalid.");

正規表現は電子メールの検証には問題なく機能しますが、特に長い文字列が正規表現に渡されて無効である場合、システムはページを解決せずに「機能」し続けます。たとえば、これは私が渡そうとしたデータです。

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

上記の文字列により、システムは基本的にロックアップします。同じことをもっと簡単な方法で実現する正規表現を使用できる理由と可能性を知りたいと思います。私の目標は、たとえば次のような誤って形成された電子メールアドレスが渡されないことです。

host.@.host..com
4

1 に答える 1

6

同じ文字を共有する繰り返し演算子がネストされているため、壊滅的なバックトラッキングが発生する可能性があります。

例えば:([-.\w]*[0-9a-zA-Z])*

これは次のように述べています: 0 回以上の の-._0-9a-zA-Z後に単一の が続く0-9a-zA-Z場合、1 回以上一致します。

iこれらのクラスの両方に該当します。

したがって、iiiiiiii...正規表現で実行すると、可能なすべての順列に一致します(several "i"s followed by one "i") several times(これは多くの順列です)。

一般に、正規表現で電子メール アドレスを検証するのは困難です。

于 2012-10-18T12:38:30.777 に答える