c# - 用于检测文本电子邮件的正则表达式

标签 c# .net regex

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

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

所以,这里的重点是 Regex 应该只检测那些不在 anchor 标记内或已经可点击的有效电子邮件,并且 anchor 标记的 href 值也不应该在 anchor 标记内。

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

最佳答案

你能不能用一个负面的后视来测试 mailto:

(?<!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})?)

应该可以

关于c# - 用于检测文本电子邮件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8910514/

相关文章:

php - 正则表达式:除特定字符外的所有 ASCII 字符(PHP、FILTER_VALIDATE_REGEXP)

regex - 当 Perl 正则表达式插值关闭时,哪些转义被排除在外?

c# - 使用 linq to entities 从表中获取重复项

c#CompareTo()方法

c# - 如何创建一个 web Api 具有 http post 功能,它可以从正文中获取任何动态 json 内容并能够将其解析为字符串

.net - 如何在 CLR 1.1 或 2.0 应用程序中使用 CLR 4.0 组件?

c# - 振动直到消息框关闭 Windows Phone 7

.net 命名约定 : Is there a semantic difference between Length and Count?

c# - 我如何访问发件人对象中的数据列表

java - 匹配换行符后的字符串