使用“OR”条件的正则表达式
Posted
技术标签:
【中文标题】使用“OR”条件的正则表达式【英文标题】:Regular expression that uses an "OR" conditional 【发布时间】: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 个子目录。
^(\w1,20)|((\w1,20)/(\w1,20))|((\w1,20)/(\w1,20)/(\w1,20))$
【问题讨论】:
澄清一下:你想让它接受这三个例子但拒绝其他任何东西? IE。 somewebsite.com/A1/B1 会不可接受吗? somewebsite.com/A1/B1 会很好。我只是在寻找可以验证三个不同子目录的东西。 你能发布你目前的正则表达式吗? 【参考方案1】:还有更多的 Django 方法可以做到这一点:
urlpatterns = patterns('',
url(r'^(?P<object_slug1>\w2/(?P<object_slug2>\w2/(?P<object_slug3>\w2)$', direct_to_template, "template": "two_levels_deep.html", name="two_deep"),
url(r'^(?P<object_slug1>\w2/(?P<object_slug2>\w2)$', direct_to_template, "template": "one_level_deep.html", name="one_deep"),
url(r'^(?P<object_slug1>\w2)$', 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 语句周围加上另一组括号:
^((\w1,20)|((\w1,20)/(\w1,20))|((\w1,20)/(\w1,20)/(\w1,20)))$
【讨论】:
【参考方案5】: ^(\w1,20)(/\w1,20)*
如果您只需要 2 个,则可以使用任意数量的子目录:
^(\w1,20)(/\w1,20)0,2
【讨论】:
【参考方案6】:http://www\.example\.com/A1(/B2(/C3)?)?
【讨论】:
以上是关于使用“OR”条件的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
使用 Boost 澄清逻辑 AND 和 OR 的正则表达式匹配