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

本文关键字:电子邮件 文本 检测 正则表达式 | 更新日期: 2023-09-27 18:20:41

我想检测文本格式的电子邮件,这样我就可以用锚中的mailto标记在它们上面放置锚标记。我有它的正则表达式,但代码也检测到已经被锚标记封装或在锚标记mailto参数内的电子邮件。

我的正则表达式是:

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

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

ttt <a href='mailto:someone@example.com'>someemail@mail.com</a> abc email@email.com

我只想要email@email.com由正则表达式匹配。

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

与我之前对另一个问题的回答非常相似,请尝试此

(?<!(?:href=['"]mailto:|<a[^>]*>))('b['w-]+('.['w-]+)*@([a-z0-9-]+('.[a-z0-9-]+)*?'.[a-z]{2,6}|('d{1,3}'.){3}'d{1,3})(:'d{4})?)

唯一真正不同的是电子邮件开始前的单词边界'b

在Regexr上可以看到类似的表达式,但并不完全相同,因为Regexr不支持lookbacking中的交替和无限长度。

最好将HTML的解析留给适合它的东西(如HtmlAgilityPack),并将其与正则表达式相结合来更新文本节点:

    string sContent = "ttt <a href='mailto:someone@example.com'>someemail@mail.com</a> abc email@email.com";
    string sRegex = @"(['w-]+('.['w-]+)*@([a-z0-9-]+('.[a-z0-9-]+)*?'.[a-z]{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, @"<a href=""mailto:$0"">$0</a>");
    }
    string fixedContent = doc.DocumentNode.OuterHtml;

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