簡體   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