【问题标题】:Simple regex negation简单的正则表达式否定
【发布时间】:2010-11-09 15:10:55
【问题描述】:

我在使用正则表达式时遇到问题,所以我想我会在这里问。基本上,我需要它来匹配集合的 URI,除了某个集合 (/new)。

即:

/properties     # match
/properties/25  # match
/properties/new # rejected

我尝试了以下变体,但无济于事:

/properties(^(/new)).*

我认为我的麻烦在于否定,但我不能完全理解我要做什么。非常感谢您对解决方案的解释!

【问题讨论】:

  • ^ 仅表示[] 内部的否定。通常它的意思是“行首”。
  • @sepp2k: ...并且仅在打开后立即使用[

标签: regex regex-negation


【解决方案1】:

^ 在字符类中取反(一组以任意顺序被[ ] 包围的字符。你需要使用?!。你也不应该使用.*。它不会添加任何东西。如果你想匹配任何东西,你就不要放任何东西:)。你也不需要捕捉比赛。根据您的设置方式,您可能还需要转义斜线 (/)

试试这个:

\/properties(?!\/new)

【讨论】:

    【解决方案2】:

    您可以简单地使用额外的RewriteCond

    RewriteCond $2 !=new
    RewriteRule ^/properties(/(.*))?$ …
    

    这将匹配 /properties/properties//properties/…,后跟任何其他内容,但不匹配 /properties/new

    【讨论】:

      【解决方案3】:

      这个怎么样:

      /properties(?!/new)(?:/.*){0,1}
      

      : `(?!/new) 是一个否定的正向查找,本质上是说:确保这不能匹配

      以下内容:(?:/.+){0,1} 允许匹配其他路径(即 /25),并且是一个非捕获组,表示匹配 / 后跟零个或多个字符,并且将其作为一组匹配零到一次。即使没有 /25,{0,1} 也允许它匹配。

      【讨论】:

      • 您不需要`(?:/.*){0,1}。如果您不想捕捉,只需将其留空即可。正则表达式的每个部分都是一条规则。如果所有规则都表示匹配并且没有更多规则,那么引擎将显示该行匹配。 .* 也不是一个好主意。
      • 好点,/new 的前瞻是他阻止这场比赛所需要的一切。感谢您的提示。
      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多