【问题标题】:Regext that start with but does not containt以但不包含开头的正则表达式
【发布时间】:2017-01-26 13:41:50
【问题描述】:

我正在尝试为重定向规则编写一个正则表达式,该规则将包括从 2010 年到 2012 年的文件夹,但不包括两个非常具体的页面 slug。我的网址设置如下:

/2016/09/18/my-page-slug/

这两个页​​面是:

/2011/04/11/some-page/ /2012/06/15/another-page-2/

我有类似 ^/2010|2011|2012/.* 之类的东西,它与那些年开始的所有子目录匹配,不知道如何为这些页面 slug 做一个例外。

我可能需要像 (?!some-page|another-page-2) 这样的负前瞻,但不知道如何设置。

【问题讨论】:

  • 您必须使用否定前瞻来匹配不包含字符串的内容。
  • @Barmar 谢谢,这很有帮助。它确实为我指明了正确的方向。真正帮助我的是调试表达式链接,我用它来测试正则表达式的变体,直到我得到正确的答案。

标签: regex


【解决方案1】:

为什么不写两个正则表达式?我的意思是,如果你愿意的话,

^\/201[012]\/\d*\/\d*\/(?!(some-page|another-page-2))

对这些字符串中的任何一个进行负面展望。

您必须非常具体地匹配字符串以及它们会在哪里出现页面。因为你需要确保像.* 这样的其他东西不能吃掉你想要处理的东西。因此,您需要指定目录,以便它必须跟在 slug 页面之后,然后进行负前瞻。您会注意到,如果您执行 .*(negative lookahead) 之类的操作,它将停止工作,因为 .* 会贪婪地匹配所有内容,然后是 $,所以一切都很好,并且否定匹配不会打折字符串。

【讨论】:

    【解决方案2】:

    所以这对任何感兴趣的人都有效:

    ^/(?!.*slug1/|.*slug2/)(?:2010|2011|2012)(.*)$
    

    真正帮助我找到正确答案的是这个网站,它可以让您轻松测试您的正则表达式:https://www.debuggex.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多