2012-10-24 120 views
3

我有追蹤圖形排除某些模式?

Administrator  yes 
User     yes 
Userb    yes 
userc    yes 
userd    yes 

我想,當有任何用戶,然後是一個匹配(與它們之間的空間的任意數量的)不是管理員,用戶,和用戶B

我曾嘗試過負面看法和負面看法。例如,對於管理員的情況下,我已經試過這

(?<!Administrator)\s+yes 

但是,仍然是具有管理員行了比賽,我懷疑是因爲\ S +的。非常感謝,謝謝。

+0

怎麼樣區分大小寫? 'userb yes'應該匹配還是不匹配?請將這些示例分爲兩類(匹配/不匹配) – Aprillion

+1

您使用的是哪種編程語言?你確定你需要這裏的正則表達式嗎?你不能只是分割空白行,並檢查用戶名字段包含什麼? – SilentGhost

回答

2

你的假設是正確的。 \s+只會匹配一個空格(例如!),然後該空格不會在Administrator之前,而是在另一個空格之前。這是不容易解決的,因爲只有在.NET中允許將\s+包含在負面lookbehind中(其他正則表達式引擎不能處理可變長度的lookbehinds)。

但是,如果使用多模式(如何激活它取決於你的語言/工具),那麼你可以改用負前瞻:

^(?!Administrator|User|Userb)\w+\s+yes 

在多模式^將匹配在開始每一行。

更新:事實上,在寫完這些之後,我確實想出了一個使用逆序的解決方案。只需確保,你一堆字,字符後立即執行的回顧後:

\w+(?<!Administrator|User|Userb)\s+yes 

現在\s+必須匹配所有的空間,否則不會通過文字字符開頭。

請注意,這兩種解決方案都對非前綴免費用戶有問題。第一個與用戶Userbob不匹配,而第二個與ThatUser不匹配。這可以通過使用單詞邊界來解決:

^(?!(?:Administrator|User|Userb)\b)\w+\s+yes 
\w+(?<!\b(?:Administrator|User|Userb))\s+yes