C# 在对代码进行基准测试时,这个正则表达式将循环的运行时间乘以4

C# 在对代码进行基准测试时,这个正则表达式将循环的运行时间乘以4,c#,regex,C#,Regex,令人讨厌的正则表达式是 TldCheck = new Regex(@"(live|lycos|mail|yahoo|gmail|msn|netzero|peoplepc|sbcglobal|verizon|hotmail|earthlink|cox|bellsouth|comcast|barracuda|att|aol)\.?(com|net|org)@", RegexOptions.IgnoreCase | RegexOptions.Compiled); 当它在列表上运行时,会导致一些严重的

令人讨厌的正则表达式是

TldCheck = new Regex(@"(live|lycos|mail|yahoo|gmail|msn|netzero|peoplepc|sbcglobal|verizon|hotmail|earthlink|cox|bellsouth|comcast|barracuda|att|aol)\.?(com|net|org)@", RegexOptions.IgnoreCase | RegexOptions.Compiled);
当它在列表上运行时,会导致一些严重的延迟。还有什么可以重写的吗?其目的是清除电子邮件列表,如:

adsfyahoocom@aol.com
adsfyahoocom@comcast.net
adfadyahoocom@gmail.com

加快速度的一种方法是执行以下操作。首先将所有域存储在
哈希集中。这是一个非常有效的查找结构,允许快速测试匹配项

HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("live");
hashSet.Add("lycos");
...
然后你就可以这样测试了

if (hashSet.Contains(GetDomain("foo@bar.com")) {
  ...
}

有几个问题要问你: -您是否真的希望匹配这些域名中的电子邮件地址?或者这只是为了捕捉最常见的电子邮件地址? -您知道您正在搜索的数据的任何特征吗?例如,有没有可能是一个很大的数据集,其中很少有匹配项


我通常不使用C语言编写代码,所以我不知道确切的语法,但你可以用@[^.]+.?(com | net | org)替换整个域名列表。如果它只需要做一次检查,而不是对比每一个域名(以及各种案例组合),我希望它会更快。然后,如果您真的只想要域名的子集,您可以再次通过这个较小的数据集,将其缩小到您想要的范围。

删除正则表达式和不必要的对象实例。如果可以的话,我会+2:)@OP:如果你的域可能是混合型的,你要么在
GetDomain
中需要一个
ToLower
,要么使用
HashSet HashSet=newhashset(StringComparer.InvariantCultureIgnoreCase)
。虽然你的答案很好,但我在@之前寻找域。我所做的只是将上面的正则表达式转换成一堆必须在@之前的索引。谢谢你提供的信息。这是用于列表清理的。代码用于捕获电子邮件地址中@之前的tld域。我改变了我的代码,使用了一系列indexof,每400万条记录减少17秒。
if (hashSet.Contains(GetDomain("foo@bar.com")) {
  ...
}