2012-01-18 91 views
3

檢測電子郵件,我有一個正則表達式在C#中檢測文本電子郵件,然後我把一個錨標記與郵寄地址在它的參數,使其點擊。但是,如果電子郵件已經在錨標記中,則正則表達式會在錨標記中檢測電子郵件,然後下一個代碼將另一個錨標記放在其上。在正則表達式中有沒有辦法避免已經在錨標籤中的電子郵件?正則表達式在文本

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:[email protected]'>[email protected]</a> abc [email protected]"; 

和期望的輸出是:

"ttt <a href='mailto:[email protected]'>[email protected]</a> abc <a href='mailto:[email protected]'>[email protected]</a>"; 

所以,整點這裏是正則表達式應該只檢測那些不在錨標籤或已經可點擊的有效電子郵件,也不是應該是錨標記內的錨標記的href值。

上面給出的正則表達式是檢測這是不期望的文本每一個可能的電子郵件。

+0

嗨@zapthedingbat,我想你的代碼,但它仍然是檢測3封電子郵件詭計應該只檢測one.can請您在您的計算機上試試?我是編程新手,我只能在我的Visual Studio編輯器中進行復制和測試。您的正則表達式正在檢測上面給出的示例測試文本中的3個匹配項。 –

回答

4

你可以使用一個負的外觀後面測試的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-])+).是匹配太多了。您的意思是使用.而不是\.

通過逃避.下面的代碼產生

[email protected] 
[email protected] 


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:[email protected]'>[email protected]</a> abc [email protected]"); 
    foreach (Match match in matchCollection) 
    { 
     Debug.WriteLine(match); 
    } 
} 

實際實現的是什麼好像你正在試圖做可能看起來更像這個

Regex pattern = new Regex(@"(?<!mailto\:)\b[\w\-][email protected][a-z0-9-]+(\.[a-z0-9\-])*\.[a-z]{2,8}\b(?!\<\/a)"); 
MatchCollection matchCollection = pattern.Matches("ttt <a href='mailto:[email protected]'>[email protected]</a> abc [email protected]"); 
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})?)

應該工作

+0

嗨@zapthedingbat,我試過你的代碼,但它仍然檢測到3封電子郵件,它只能檢測到一個。你可以試試你的電腦嗎?我是編程新手,我只能在我的Visual Studio編輯器中進行復制和測試。您的正則表達式正在檢測上面給出的示例測試文本中的3個匹配項。 –