簡體   English   中英

正則表達式-將電子郵件地址與例外匹配

[英]Regular Expression - Match Email Address with Exceptions

請仔細閱讀問題,這與驗證電子郵件地址無關!

我正在嘗試構造一個正則表達式(當前在C#中),該正則表達式從文本中提取所有電子郵件地址,但有兩個特定的例外。

我有:

  • user1@company.com
  • user2@company.com
  • user3@company.com
  • user1@private.com
  • user2@private.com

所有內容都在同一行的同一文本文件中,以空格字符分隔。

最初,我嘗試匹配所有這些以“ user1”開頭的電子郵件地址。 我用了:

[\S]*(?<!user1)@[\S]*\..[a-zA-Z.]{1,}

效果很好。 現在,我還有另一個要求:如果完整的電子郵件地址匹配“ user2@private.com”,則也將不匹配。 因此它應該匹配“ user2@company.com”,因此我不能使用:

[\S]*(?<!(user1|user2))@[\S]*\..[a-zA-Z.]{1,}

因此,我在后面嘗試了另外一個負面的看法:

([\S]*(?<!user1)@[\S]*\..[a-zA-Z.]{1,})(?<!user2@private\.com)

這是行不通的,因為我猜似乎對匹配“ user2@private.co”很滿意。 有什么方法可以實現我的目標? 我的頭已經疼了...

我會使用其他代碼,但是由於我使用的第三方軟件僅給我正則表達式的選項,而只有單個正則表達式的選項,這就是我所擁有的全部...

一個看起來不太好的正則表達式解決方案是

(?<!\S)(?!user1@|user2@private\.com(?!\S))\S+@\S+\.[a-zA-Z]{2,}(?!\S)

參見regex演示

詳細資料

  • (?<!\\S) -不以非空白char開頭的位置
  • (?!user1@|user2@private\\.com(?!\\S)) -該位置不能跟隨user1@user2@private.com不能跟隨非空格字符
  • \\S+ -1+非空格
  • @ -文字@
  • \\S+ -1+非空格
  • \\. -一個點
  • [a-zA-Z]{2,}(?!\\S) -2個或更多ASCII字母,后跟非空格字符。

更具可讀性的方法是使用空格分割,獲取與@"^\\S+@\\S+\\.\\S+$"匹配的項目,並使用一些代碼來過濾掉不需要的匹配項:

var s = @"Text user1@company.com here user2@company.com and user3@company.com here user1@private.com more user2@private.com";
var result = s.Split().Where(m => 
        Regex.IsMatch(m, @"^\S+@\S+\.\S+$") && m != "user2@private.com" && !m.StartsWith("user1@"));
foreach (var str in result)
    Console.WriteLine(str);
// => user2@company.com, user3@company.com

參見C#演示

您應該可以使用否定的前瞻。 如果您需要過濾掉明確的電子郵件,則以下解決方案應該可以使用。 但是請記住,它不是完全可擴展的。 您不希望在此處應用數千封電子郵件。

^(?!user1|user2(?!@company.com))[\\S]*@[\\S]*\\..[a-zA-Z.]{1,}

如果您懷疑將來可能會應用許多規則,那么您可能需要考慮一種更好的方法。 如果要過濾的電子郵件是顯式的(不是模式),則可以在某處維護黑名單,並在提取/驗證電子郵件地址模式后將其過濾掉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM