【问题标题】:Dollar sign ($) at the end of URL patterns in TornadoTornado 中 URL 模式末尾的美元符号 ($)
【发布时间】:2012-09-20 09:13:21
【问题描述】:

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

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

编辑以更清楚我的意思:

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

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

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

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

【问题讨论】:

标签: regex url tornado


【解决方案1】:

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

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

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

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

^hello/$

该模式包括一个插入符号 (^) 和一个美元符号 ($)。这些是 具有特殊含义的正则表达式字符:插入符号 表示“要求模式与字符串的开头匹配”,并且 美元符号的意思是“要求模式匹配 字符串。”

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

【讨论】:

  • 我认为 Tornado 和 Django 的行为不同,如果你想匹配任何包含该模式的 url,你必须在前后显式添加 .*
  • @fortran 据我了解,当您想使用 Add/Remove Slash Decorator 时添加 *
  • 这适用于 Django,但不适用于 Tornado。我会添加一个答案。
【解决方案2】:

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

我们可以通过查看URLSpec source 看到这一点:

if not pattern.endswith('$'):
    pattern += '$'

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2017-05-25
    • 2013-10-15
    • 2016-08-29
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多