【问题标题】:Regular expression that uses an "OR" conditional使用“OR”条件的正则表达式
【发布时间】:2010-09-16 06:48:55
【问题描述】:

我可以使用一些帮助来编写正则表达式。在我的 Django 应用程序中,用户可以点击以下 URL:

http://www.example.com/A1/B2/C3

我想创建一个允许接受以下任何内容作为有效 URL 的正则表达式:

http://www.example.com/A1  
http://www.example.com/A1/B2  
http://www.example.com/A1/B2/C3  

我猜我需要使用“OR”条件,但我无法让我的正则表达式进行验证。有什么想法吗?

更新:这是目前的正则表达式。请注意,我没有包含“http://www.example.com”部分——Django 会为我处理。我只关心验证 1、2 或 3 个子目录。

^(\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20}))$

【问题讨论】:

  • 澄清一下:你想让它接受这三个例子但拒绝其他任何东西? IE。 somewebsite.com/A1/B1 会不可接受吗?
  • somewebsite.com/A1/B1 会很好。我只是在寻找可以验证三个不同子目录的东西。
  • 你能发布你目前的正则表达式吗?

标签: regex django django-urls


【解决方案1】:

还有更多的 Django 方法可以做到这一点:

urlpatterns = patterns('',
    url(r'^(?P<object_slug1>\w{2}/(?P<object_slug2>\w{2}/(?P<object_slug3>\w{2})$', direct_to_template, {"template": "two_levels_deep.html"}, name="two_deep"),
    url(r'^(?P<object_slug1>\w{2}/(?P<object_slug2>\w{2})$', direct_to_template, {"template": "one_level_deep.html"}, name="one_deep"),
    url(r'^(?P<object_slug1>\w{2})$', direct_to_template, {"template": "homepage.html"}, name="home"),
)

其他方法没有利用 Django 传递变量的能力。

编辑:我将 urlpattern 的顺序切换为对解析器更明显(即自下而上比自上而下定义更多)。

【讨论】:

    【解决方案2】:

    请注意,Django 的 reverse URL matching(永久链接、reverse(){% url %})可以处理有限的正则表达式子集。为了能够使用它们,有时需要将复杂的正则表达式拆分为单独的 URL 调度程序规则。

    【讨论】:

      【解决方案3】:

      跳过|,使用?()

      http://www\.example\.com/A1(/B2(/C3)?)?

      如果您将 A1-C3 替换为模式:

      http://www\.example\.com/[^/]*(/[^/]*(/[^/]*)?)?

      解释:

      • 匹配每个以http://www.example.com/A1开头的字符串
      • 它可以匹配一个额外的/B2,甚至是一个额外的/C3,但/C3只有在有/B2时才会匹配
      • [^/]*(尽可能多的非斜线)
      • 如果您需要特殊捕获组中的 A1-C3,您可以使用这个:

      http://www\.example\.com/([^/]*)(/([^/]*)(/([^/]*))?)?

      会给(groupnumber: content):

      matches: 0: (http://www.example.com/dir1/dir2/dir3)
      1: (dir1)
      2: (/dir2/dir3)
      3: (dir2)
      4: (/dir3)
      5: (dir3)
      

      您可以在线查看here 或获取此tool(是的,它是免费的,它甚至是用 Lisp 编写的......)。

      【讨论】:

      • 出于好奇,如果您想测试一个 URL 是以 .html 还是 .pdf 结尾,但不关心它以什么开头,那么正则表达式会是什么样子?
      【解决方案4】:

      如果我理解的话,我认为您只需要在整个 OR 语句周围加上另一组括号:

      ^((\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20})))$
      

      【讨论】:

        【解决方案5】:
         ^(\w{1,20})(/\w{1,20})*
        

        如果您只需要 2 个,则可以使用任意数量的子目录:

         ^(\w{1,20})(/\w{1,20}){0,2}
        

        【讨论】:

          【解决方案6】:
          http://www\.example\.com/A1(/B2(/C3)?)?
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-01
            • 1970-01-01
            • 2019-08-15
            • 1970-01-01
            • 2012-07-17
            • 2021-08-08
            • 1970-01-01
            相关资源
            最近更新 更多