[英]Regular Expression - Match Email Address with Exceptions
請仔細閱讀問題,這與驗證電子郵件地址無關!
我正在嘗試構造一個正則表達式(當前在C#中),該正則表達式從文本中提取所有電子郵件地址,但有兩個特定的例外。
我有:
所有內容都在同一行的同一文本文件中,以空格字符分隔。
最初,我嘗試匹配所有這些以“ 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.