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



有问题的正则表达式是

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<string> hashSet = new HashSet<string>();
hashSet.Add("live");
hashSet.Add("lycos");
...

接下来,您需要拆分每个电子邮件地址,以便可以取出域。 最简单的方法是执行以下操作

string GetDomain(string email) {
  var index = email.IndexOf('@');
  var end = email.IndexOf('.', index + 1);
  return email.Substring(index, end - index);
}

然后你可以这样测试

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

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

稀疏匹配项的大型数据集?

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

最新更新