繁体   English   中英

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

[英]Regex for detecting emails in text

我在C#中使用Regex来检测文本中的电子邮件,然后在其中放入一个带有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>";

因此,这里的重点是,Regex应该只检测那些不在锚标签内或已经可点击的有效电子邮件,并且它们都不应该是锚标记内锚标记的href值。

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

您可以使用负面外观来测试mailto:

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

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

我认为正在发生的事情是. in ([\\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-]+)?.[az]{2,6}|(\\d{1,3}.){3}\\d{1,3})(:\\d{4})?)

应该管用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM