任何人都可以告诉我为什么这个C#电子邮件validation正则表达式(正则表达式)挂起?
我有一个很好的电子邮件vaidation正则表达式: 电子邮件正则表达式
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 metro应用程序中测试过。 以及标准的.Net 4.5应用程序。
任何人都可以告诉我为什么会发生这种情况,如果有一个好的电子邮件validationREGEX没有挂起,或者有没有办法解决这个问题?
非常感谢,乔恩
解释它为什么会挂起: 灾难性的回溯 。
让我们简化正则表达式的关键部分:
(\w*[0-9a-zA-Z])*@
你有
- 一个可选的部分
\w*
,它可以匹配与下面部分[0-9a-zA-Z]
相同的字符,所以两者组合翻译,实质上是\w+
- 嵌套量词:
(\w+)*
这意味着,给定s = "cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc"
找不到@
。
由于您无法使用任何正则表达式validation电子邮件地址(规范中存在太多极端情况),因此通常最好
- 做一个最小的正则表达式检查(
^.*@.*$
) - 使用解析器检查有效性(如@ Fake.It.Til.U.Make.It建议)
- 尝试向它发送电子邮件 – 即使看似有效的地址也可能是假的,所以无论如何你都必须这样做。
为了完整起见,您可以在primefaces组的帮助下避免回溯问题:
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);
永远不要使用regex
validation电子邮件..
您可以使用MailAddress类来validation它
try { address = new MailAddress(address).Address; //address is valid } catch(FormatException) { //address is invalid }
猜测是因为正则表达式中的[ – 。\ 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应该可用,但不确定