Regex 正则表达式是否将url与后缀匹配?

Regex 正则表达式是否将url与后缀匹配?,regex,django,Regex,Django,所以我有一个有趣的正则表达式挑战。考虑下面的[django URL路由]正则表达式: (/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?/postfix (/(?P[a-zA-Z0-9\-]+)(/(?P[a-zA-Z0-9\-]+))/postfix 我有第二个URL,如下所示(注意缺少后缀): (/(?P[a-zA-Z0-9\-]+)(/(?P[a-zA-Z0-9\-]

所以我有一个有趣的正则表达式挑战。考虑下面的[django URL路由]正则表达式:

(/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?/postfix
(/(?P[a-zA-Z0-9\-]+)(/(?P[a-zA-Z0-9\-]+))/postfix
我有第二个URL,如下所示(注意缺少后缀):

(/(?P[a-zA-Z0-9\-]+)(/(?P[a-zA-Z0-9\-]+)?
换句话说,我得到了一个必需的部分,后跟一个可选部分,后跟一个后缀,该后缀也与可选部分匹配。我希望所有以后缀结尾的URL都能与第一个匹配,而所有不以后缀结尾的URL都能与第二个匹配。问题是,在所有情况下,后缀都被可选部分捕获,而第二个模式匹配


我应该如何处理这个问题?如果解决方案在我将数据库注入到数据库时没有引入数据库注入漏洞,则会获得额外的积分

您可以通过在末尾添加一个
$
来限制第二个正则表达式的范围,从而使第二个正则表达式只匹配其路径中有两个目录的URL,或者您可以在第二个正则表达式的末尾添加一个负前瞻,以便只搜索没有后缀作为第三个目录的URL:

^(/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?(?!/postfix)
^(/(?P[a-zA-Z0-9\-]+)(/(?P[a-zA-Z0-9\-]+)?(!/postfix)

我还建议在正则表达式的开头添加一个
^
。如果没有它,上面的正则表达式可以回溯并匹配
/foo/bar/postfix/baz

是否有特殊原因需要使用(?p)符号,而不仅仅是使用普通的捕获组?此外,是否足以替代[a-zA-Z0-9\-]的使用?我使用该符号允许django将捕获的文本传递到我的视图方法中。此外,我更喜欢使用完整的正则表达式,因为我发现使用速记会降低代码的可读性,也更难进行推理。
^(/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?(?!/postfix)