【问题标题】:Regex for detecting emails in text用于检测文本中电子邮件的正则表达式
【发布时间】:2012-01-18 13:00:57
【问题描述】:

我在 C# 中有一个正则表达式来检测文本中的电子邮件,然后我在其中放置了一个带有 mailto 参数的锚标记以使其可点击。但是,如果电子邮件已经在锚标记中,则正则表达式会检测到锚标记中的电子邮件,然后下一个代码会在其上放置另一个锚标记。 Regex 中有什么方法可以避免已经在锚标签中的电子邮件?

C#中的正则表达式代码是:

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

示例文本为:

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

所需的输出是:

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

所以,这里的重点是正则表达式应该只检测那些不在锚标签内或已经可点击的有效电子邮件,也不应该是锚标签内的锚标签的 href 值。

上面给出的正则表达式正在检测文本中所有可能不需要的电子邮件。

【问题讨论】:

  • 嗨@zapthedingbat,我试过你的代码,但它仍然检测到3封电子邮件,但它应该只检测到一个。你能在你的电脑上试试吗?我是编程新手,我只能在我的 Visual Studio 编辑器中复制和测试。您的正则表达式在上面给出的示例测试文本中检测到 3 个匹配项。

标签: c# .net regex


【解决方案1】:

你能用否定的眼神来测试mailto吗:

(?&lt;!mailto\:)([\w-]+(.[\w-]+)@([a-z0-9-]+(.[a-z0-9-]+)?.[a-z]{2,6}|(\d{1,3}.){3}\d{1,3})(:\d{4})?)

应该匹配前面没有mailto:的任何内容

我认为正在发生的事情是([\w\-]+(.[\w-])+) 中的. 匹配太多。您的意思是使用. 而不是\. 吗?

通过转义. 生成以下代码

someemail@mail.com
email@email.com


public void Test()
{

    Regex pattern = new Regex(@"\b(?<!mailto:)([\w\-]+(\.[\w\-])*@([a-z0-9-]+(.[a-z0-9-]+)?.[a-z]{2,6}|(\d{1,3}.){3}\d{1,3})(:\d{4})?)");
    MatchCollection matchCollection = pattern.Matches("ttt <a href='mailto:someone@example.com'>someemail@mail.com</a> abc email@email.com");
    foreach (Match match in matchCollection)
    {
        Debug.WriteLine(match);
    }
}

你正在尝试做的事情的真实世界实现可能看起来更像这样

Regex pattern = new Regex(@"(?<!mailto\:)\b[\w\-]+@[a-z0-9-]+(\.[a-z0-9\-])*\.[a-z]{2,8}\b(?!\<\/a)");
MatchCollection matchCollection = pattern.Matches("ttt <a href='mailto:so1meone@example.com'>someemail@mail.com</a> abc email@email.com");
foreach (Match match in matchCollection)
{
    Debug.WriteLine(match);
}

对不起,你是对的,我没有考虑到否定断言不够贪婪。

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

应该工作

【讨论】:

  • 嗨@zapthedingbat,我试过你的代码,但它仍然检测到3封电子邮件,但它应该只检测到一个。你能在你的电脑上试试吗?我是编程新手,我只能在我的 Visual Studio 编辑器中复制和测试。您的正则表达式在上面给出的示例测试文本中检测到 3 个匹配项。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 2014-11-10
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多