2012-06-14 57 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