[英]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.