正则表达式匹配模式并排除字符串列表

时间:2012-06-14 07:13:28

标签: regex

我是Regex的新手。

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

理想情况下,网址应为

/mobile/retail.*

由于该错误,该网址将在'/ 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 - &gt; <不匹配
  • / mobile / something / sale / something - &gt; <不匹配
  • / mobile / something / sale / something / retail - &gt; <不匹配
  • / mobile / lot / test / retail - &gt; <不匹配
  • / mobile / test / lot / test / retail - &gt; <不匹配
  • / mobile / path / test2 / test3 / testx / lot / test / retail - &gt; <不匹配

我有点坚持这个正则表达式,它不能像我想要的那样工作..

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

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

  • /移动/东西/销售/东西/零售
  • /移动/测试/批次/测试/零售
  • /移动/路径/ TEST2 / TEST3 / testx /批/测试/零售

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

  • /移动/情节/零售
  • /移动/批次/零售
  • /移动/大量销售/零售
  • /移动/销售项目/零售/东西/测试/销售
  • /移动/搜索-PRG项测试/检验/零售

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

一个正则表达式,它反复匹配斜杠之间的部分,其中这样的部分可能不是销售,搜索,批次或登录:

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