使用“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”条件的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:如果条件发生则匹配值

使用 or 匹配正则表达式

使用 Boost 澄清逻辑 AND 和 OR 的正则表达式匹配

使用具有多个真值的 OR 使用正则表达式提取字符串它返回啥结果?

Python 正则表达式匹配 OR 运算符

nginx 使用 OR 在正则表达式中设置地图