2

我可以使用一些帮助来编写正则表达式。在我的 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}))$
4

6 回答 6

6

跳过|, 使用?and()

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)

你可以在这里在线查看或获取这个工具(是的,它是免费的,它甚至是用 Lisp 编写的......)。

于 2008-10-09T14:02:13.133 回答
3

有更多的 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 的顺序切换为对解析器更明显(即自下而上比自上而下定义更多)。

于 2009-07-22T19:52:14.793 回答
1
http://www\.example\.com/A1(/B2(/C3)?)?
于 2008-10-09T14:01:16.160 回答
1
 ^(\w{1,20})(/\w{1,20})*

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

 ^(\w{1,20})(/\w{1,20}){0,2}
于 2008-10-09T14:03:50.803 回答
1

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

^((\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20})))$
于 2008-10-09T14:04:10.867 回答
1

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

于 2008-10-15T19:39:59.987 回答