2012-06-14 75 views
2

我對Regex很新穎。正則表達式匹配一個模式並排除字符串列表

基本上我試圖創建一個正則表達式來評估我們系統的URL路徑。然而,在我們的系統中的已知錯誤,這導致URL路徑成爲真的很亂..

理想情況下,URL應該是

/mobile/retail.* 

由於錯誤的URL都會有「別的東西」在「/移動」和「/零售」這樣的事情

/mobile(/.*)?/retail

但具有挑戰性的一點是,當有一些的話,我想忽略在「別的東西」,即銷售,搜索之間,很多,登錄。所以情況應該是這樣的

所以我有一個測試用例是這樣的:

  • /移動/零售 - >比賽
  • /移動/零售/東西 - >比賽
  • /移動/事/零售/東西 - >比賽
  • /移動/事/零售/事/銷售 - >比賽
  • /移動/事/某事/零售/事/銷售 - >比賽
  • /美孚/銷售/什麼 - >不匹配
  • /移動/事/銷售/什麼 - >不匹配
  • /移動/事/銷售/事/零售 - >不匹配
  • /移動/很多/測試/零售 - >不匹配
  • /移動/測試/批號/測試/零售 - >不匹配
  • /移動/路/ TEST2/TEST3/testx /批號/測試/零售 - >不匹配

我有點卡在這個正則表達式,它不工作如何我想它..

/mobile(/(?!sale|search|lot|login).*)?/retail.* 

上述正則表達式不會在條件這樣的工作:

  • /移動/事/銷售/事/零售
  • /移動/測試/批號/測試/零售
  • /mobile/path/test2/test3/testx/lot/test/retail

要排除的詞是嚴格的。例如,下面的名單應該通過:

  • /移動/劇情/零售
  • /移動/手/零售
  • /移動/大量銷售/零售
  • /移動/銷售-Item /零售/事/測試/銷售
  • /移動/搜索PRG項測試/測試/零售

任何人都具有較強的正則表達式的知識和任何反饋是非常讚賞。

回答

6

第一次嘗試這樣的:

/mobile(?:/(?:(?!sale|search|lot|login)[^/])++)*/retail.* 

如果失敗編譯(沒有指定您正則表達式的味道),嘗試

/mobile(?:/(?:(?!sale|search|lot|login)[^/])+)*/retail.* 

說明:

/mobile      # Match "/mobile" 
(?:       # Match... 
/      # a slash 
(?:      # followed by... 
    (?!sale|search|lot|login) # (only if these strings arent't present 
    [^/]      # any character except slashes 
)++      # Match at least one and don't backtrack 
)*       # Do this zero or more times 
/retail      # Then match "/retail" 
.*       # plus whatever follows 
2

一個正則表達式,重複匹配斜線之間的部分,在這樣的部分可能不是搜索,批次或登錄:

^/mobile(/(?!sale|search|lot|login)[^/]*)*/retail.* 
+0

我認爲這比我的好,因爲它會讓'/ mobile/plot/retail'這樣的路徑通過(我的拒絕路徑)。當然,你也會拒絕'/ mobile/lots/retail'。 @威爾遜沒有詳細說明這些「壞詞」需要被嚴格解讀的程度。 –

+0

喜蒂姆,它只是/特定///銷售/所以,例如,我期待/移動/陰謀/零售和/移動/地段/零售通過。另一個例子,如果它/移動/ saleitem /零售也應該通過。如果這是有道理 – Wilson

+0

我發現這個正則表達式:/mobile(?!(.*)(/sale/|/search/|/lot/|/login/).*/retail).*/retail.*,看起來像這是工作! :) – Wilson