3

我对正则表达式很陌生。

基本上我正在尝试创建一个正则表达式来评估我们系统中的 URL 路径。但是,我们的系统中存在一个已知错误,导致 URL 路径变得非常混乱。

理想情况下,URL 应该是

/mobile/retail.*

由于该错误,URL 将在“/mobile”和“/retail”之间包含“其他内容”,如下所示

/mobile(/.*)?/retail

但具有挑战性的一点是,当我想在“其他”中忽略某些词时,即销售、搜索、批次、登录。所以情况应该是这样的

所以我有一个这样的测试用例:

  • /mobile/retail -> 匹配
  • /mobile/retail/something -> 匹配
  • /mobile/something/retail/something -> 匹配
  • /mobile/something/retail/something/sale -> 匹配
  • /mobile/something/something/retail/something/sale -> 匹配
  • /mobil/sale/something -> 不匹配
  • /mobile/something/sale/something -> 不匹配
  • /mobile/something/sale/something/retail -> 不匹配
  • /mobile/lot/test/retail -> 不匹配
  • /mobile/test/lot/test/retail -> 不匹配
  • /mobile/path/test2/test3/testx/lot/test/retail -> 不匹配

我有点坚持这个正则表达式,它没有按我想要的方式工作..

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

上面的正则表达式在以下情况下不起作用:

  • /移动/某物/销售/某物/零售
  • /移动/测试/批次/测试/零售
  • /mobile/path/test2/test3/testx/lot/test/retail

要排除的词是严格的。例如,下面的列表应该通过:

  • /移动/情节/零售
  • /移动/批次/零售
  • /移动/大量销售/零售
  • /mobile/sale-item/retail/something/test/sale
  • /mobile/search-prg-item-test/test/retail

非常感谢任何具有强大的正则表达式知识和任何反馈的人。

4

2 回答 2

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
于 2012-06-14T07:19:30.190 回答
2

重复匹配斜线之间的部分的正则表达式,其中此类部分可能不是销售、搜索、批次或登录:

^/mobile(/(?!sale|search|lot|login)[^/]*)*/retail.*
于 2012-06-14T07:25:00.487 回答