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,一次或多次。

i属于这两个类别。

因此,当在iiiiiiii...正则表达式上运行时,匹配每个可能的排列(several "i"s followed by one "i") several times(这是很多排列)。

通常,使用正则表达式验证电子邮件地址很困难。

于 2012-10-18T12:38:30.777 回答