使用正则表达式检测文本中的电子邮件

我希望以文本格式检测电子邮件,以便我可以在锚点上使用mailto标记在其上放置锚标记。 我有它的正则表达式,但代码还检测已经由锚标记封装或在锚标记mailto参数内的电子邮件。

我的正则表达式是:

([\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[az]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?) 

但它在以下示例文本中检测到3个匹配项:

 ttt someemail@mail.com abc email@email.com 

我希望只有email@email.com才能与正则表达式匹配。

与我之前对你的其他问题的回答非常相似,试试这个

 (?]*>))(\b[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[az]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?) 

唯一真正不同的是电子邮件开头之前的边界\b

在Regexr上看到一个类似的表达式,它不完全相同,因为Regexr不支持外观中的交替和无限长度。

将HTML的解析保留为适合的内容(例如HtmlAgilityPack )并将其与正则表达式结合以更新文本节点是一个更好的主意:

  string sContent = "ttt someemail@mail.com abc email@email.com"; string sRegex = @"([\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[az]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?)"; Regex Regx = new Regex(sRegex, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(sContent); var nodes = doc.DocumentNode.SelectNodes("//text()[not(ancestor::a)]"); foreach (var node in nodes) { node.InnerHtml = Regx.Replace(node.InnerHtml, @"$0"); } string fixedContent = doc.DocumentNode.OuterHtml; 

我注意到你也在其他论坛上发布了同样的问题,但没有在其中任何一个中指定答案。

只需在左括号后插入一个\ s +,如下所示:

 (\s+[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[az]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?) 

通过这种方式,您只能在空格后收到电子邮件,忽略mailto:或结束标记( > )之后的mailto: