2012-01-18 5 views
3

文字列の電子メールを検出するためにC#でRegexを使用し、次にmailtoパラメータでアンカータグを付けてクリック可能にします。しかし電子メールが既にアンカータグに入っている場合、正規表現はアンカータグ内の電子メールを検出し、次のコードは別のアンカータグをその上に置きます。 Regexに既にアンカータグにある電子メールを避ける方法はありますか?テキスト内の電子メールを検出するための正規表現

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

とサンプルテキストは次のとおり:

C#での正規表現コードが

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

、全体のポイントRegexは、アンカータグの中にないか、既にクリック可能で、どちらも有効ではない有効な電子メールだけを検出する必要があるということですアンカータグ内のアンカータグのhref値である必要があります。

上記のRegexは、望ましくないテキストの可能なすべての電子メールを検出しています。

+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})?)

は、私は何が起こっていること([\w\-]+(.[\w-])+).だと思うmailto:

が付いていないものが一致していると一致する必要があり過度に。 \.ではなく.を使用しましたか?

次のコードは、あなたがしようとしているようには思われるものの

[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、私はあなたのコードを試しましたが、それはまだone.canあなたがあなたのコンピュータで試してみてください検出する必要があります3つの電子メールを検出している?私はプログラミングの新人です。私はVisual Studioエディタでのみコピーしてテストすることができます。あなたの正規表現は上記のサンプル・テスト・テキストで3つのマッチを検出しています。 –