gpt4 book ai didi

c# - 谁能告诉我为什么这个 C# 电子邮件验证正则表达式 (regex) 挂起?

转载 作者:太空狗 更新时间:2023-10-29 22:08:19 25 4
gpt4 key购买 nike

我从以下位置获得了一个很好的电子邮件验证正则表达式: Email regular expression

    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 地铁应用程序中测试过。在标准的 .Net 4.5 应用程序上。

谁能告诉我为什么会发生这种情况,是否有不会挂起的良好电子邮件验证 REGEX,或者是否有解决此问题的方法?

非常感谢,乔恩

最佳答案

挂起原因的解释:Catastrophic backtracking .

让我们简化正则表达式的关键部分:

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

你有

  • 一个可选部分\w*,可以匹配与后面部分[0-9a-zA-Z]相同的字符,所以两者结合翻译,在本质,到\w+
  • 嵌套量词:(\w+)*

这意味着,给定 s = "cvcvcvcvvcvvcvcvcvcvcvvcvcvcvcvcvvccvcvcvc",正则表达式的这一部分需要检查 s 的所有可能排列(2* *(len(s)-1)) 在未找到以下 @ 时决定不匹配之前。

由于您无法使用任何正则表达式验证电子邮件地址(规范中有太多极端情况),通常最好

  • 做一个最小的正则表达式检查(^.*@.*$)
  • 使用解析器检查有效性(如@Fake.It.Til.U.Make.It 建议)
  • 尝试向它发送电子邮件 - 即使看似有效的地址也可能是假的,因此无论如何您都必须这样做。

为了完整起见,您可以借助 atomic groups 避免回溯问题:

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);

关于c# - 谁能告诉我为什么这个 C# 电子邮件验证正则表达式 (regex) 挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13087755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com