2012-05-31 65 views

回答

10

這是正則表達式前瞻的解決方案,整個字符串匹配如果它包含在短短的參考任何訂單所需的部件。如果你不存儲在某種配置變量的模式,我會跟nhahtdh的解決方案堅持,雖然。

/^(?=.*OU=Karen)(?=.*OU=admin).*$/ 

^  - line start 
(?=  - start zero-width positive lookahead 
.*  - anything or nothing 
OU=Karen - literal 
)  - end zero-width positive lookahead 
     - place as many positive or negative look-aheads as required 
.*  - the whole line 
$  - line end 
+0

感謝您的解釋! – ahmd0

1

您可以或indexOf()多少條件檢查確切的字符串。不需要正則表達式。

可展望的正則表達式(因爲它可以支持更多的條件)可能是展望未來,但我懷疑它會表現得更好。

如果要在相同的字符串上多次執行此類操作,並且字符串上有許多標記,則可以考慮解析字符串並將其存儲在某個數據結構中。

+0

恕我直言,不是問題的答案但你是對的 – rekire

+0

有時,對「IX怎麼做?」這個問題的最佳答案是「不要做X,反而做Y」。RE是一個很棒的工具,但是鏈鋸也是 - 我仍然不會用它來敲擊指甲: - ) – paxdiablo

+0

我不能使用任何編程語言。它必須是正則表達式。抱歉。 – ahmd0

0

不,除非你使用vi:它有一個\&操作

/(OU=Karen.*OU=admin|ou=admin.*OU=Karen)/ 

這可能是足夠接近,雖然,或類似的。

3

如果必須使用正則表達式,你可以使用

/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/ 
+0

+1爲非貪婪正則表達式 – rekire

6

你意識到你沒有做一切有一個正則表達式,甚至一個正則表達式。

正則表達式對於捕獲輸入類非常有用,但是如果您有兩個完全固定的字符串,則可以對它們兩者使用類型的方法,然後使用and結果。

另外,如果你需要使用正則表達式,你可以做兩次(每個字符串一次)和and結果在一起。

如果您需要一個正則表達式來做到這一點,你可以嘗試這樣的:

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen, 

但隨後你必須還擔心當這些節出現在開始或結束該行以及各種其他邊緣情況(開頭或結尾處的一個或兩個,彼此相鄰,名稱如Karen7administrator-lesser等)。

有允許所有可能性將可能喜歡的東西怪異結束:

^OU=Karen(,[^,]*)*,OU=admin,| 
^OU=Karen(,[^,]*)*,OU=admin$| 
,OU=Karen(,[^,]*)*,OU=admin,| 
,OU=Karen(,[^,]*)*,OU=admin$| 
^OU=admin(,[^,]*)*,OU=Karen,| 
^OU=admin(,[^,]*)*,OU=Karen$| 
,OU=admin(,[^,]*)*,OU=Karen,| 
,OU=admin(,[^,]*)*,OU=Karen$ 

雖然有先進的enouge正則表達式引擎,這可能是還原到更小的東西(儘管它不太可能只是因爲所有的前瞻性/後向追蹤都會更快)。

一種方式可以沒有複雜的正則表達式來提高就是按摩你的弦稍微前手,使邊界檢查不需要:

newString = "," + origString.replace (",", ",,") + "," 

,使其開始,以逗號結尾以及其中的所有逗號是重複的:

,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM, 

然後你只需要檢查的要簡單得多:

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen, 

這樣可以消除上述所有潛在的問題:

  • 無論是在字符串的開始。
  • 或者在字符串的末尾。
  • 都相互鄰接。
  • 擴展名如Karen2意外匹配。

也許最好方式做到這一點(如果你的語言允許)是簡單地分割字符串的逗號並檢查他們,是這樣的:

str = "OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM" 
elems[] = str.splitOn(",") 

gotKaren = false 
gotAdmin = false 
for each elem in elems: 
    if elem = "OU=Karen": gotKaren = true 
    if elem = "OU=admin": gotAdmin = true 

if gotKaren and gotAdmin: 
    weaveYourMagicHere() 

這既忽略了它們可能出現的順序,並繞過可能需要檢測邊緣情況的任何正則表達式「體操」。

它也有可能比同等正則表達式:-)

+0

再次,正如我上面所說,感謝解釋,但這隻能是一個正則表達式。 – ahmd0

+0

@ ahmd0,那麼你可以看看我給出的正則表達式,解釋了我所警告的所有可能性。或者,如果您的正則表達式引擎足夠先進,Eugene的解決方案可能是最好的。 – paxdiablo

+0

+1。忘記分裂和檢查(我只考慮在我的文章中重複檢查)。不確定,但這種方式的表現可能會更好。 – nhahtdh

-1

您可以使用類似(OU \ =卡倫可讀性更強的優勢

+1

嗨,歡迎來到Stack Overflow。這可能很好地回答了這個問題 - 但有點解釋總是一個好主意。 S/O上有許多新手可能會從你身上學到一兩樣東西,而對你來說可能是顯而易見的東西,對他們來說不會是什麼。 –

相關問題