1

我在一个交给我的团队的 Tornado 应用程序中看到了一些以 $ 结尾的 URL 正则表达式......也许我不是最懂网络的人,这对其他人来说很明显,但我看不出它的区别在匹配整个字符串(不在内部搜索)时明确指示行尾。

有什么我遗漏的或者只是多余的吗?

编辑以使我的意思更清楚:

   handlers = [
        tornado.web.URLSpec(r'/About/$', ShowSettingsHandler),
        ...
   ]

这应该与以下内容完全相同:

   handlers = [
        tornado.web.URLSpec(r'/About/', ShowSettingsHandler),
        ...
   ]

因为处理程序调度程序查找完全匹配,而不是子字符串。

4

2 回答 2

4

不同之处在于,该$符号确保即使完全匹配,该模式也不是另一个模式的子字符串。请参阅这两个正则表达式以匹配 url 模式。

  1. 带有 $ 符号: http ://regexr.com?327d2

  2. 没有 $ 符号: http ://regexr.com?327d5

这是djangobook的一些摘录,可能也与龙卷风有关:

^hello/$

该模式包括插入符号 (^) 和美元符号 ($)。这些是具有特殊含义的正则表达式字符:插入符号的意思是“要求模式匹配字符串的开头”,美元符号的意思是“要求模式匹配字符串的结尾”。</p>

这个概念最好通过例子来解释。如果我们改为使用模式 '^hello/'(末尾没有美元符号),那么任何以 /hello/ 开头的 URL 都会匹配,例如 /hello/foo 和 /hello/bar,而不仅仅是 /hello/ . 类似地,如果我们省略了初始插入字符(即'hello/$'),Django 将匹配任何以 hello/ 结尾的 URL,例如 /foo/bar/hello/。如果我们只使用了 hello/,没有插入符号或美元符号,那么任何包含 hello/ 的 URL 都会匹配,例如 /foo/hello/bar。因此,我们同时使用插入符号和美元符号来确保只有 URL /hello/ 匹配——不多也不少。

于 2012-09-20T09:34:32.140 回答
3

Tornado 中不需要尾随$。我把它们放在了习惯上,因为我认为它更清楚,但r"^/hello"只会匹配 /hello。

我们可以通过查看URLSpec 源代码看到这一点:

if not pattern.endswith('$'):
    pattern += '$'
于 2012-09-21T00:40:19.127 回答