1

私のチームに渡されたTornadoアプリで$で終わるURLregexpsを見たことがあります...多分私は最もウェブの知識が豊富な人ではなく、これは他の人にとっては明らかですが、違いはわかりません文字列全体に一致する場合(内部を検索しない場合)、行の終わりを明示的に示します。

私が見逃しているものがありますか、それとも単に冗長ですか?

私が何を意味するかを明確にするために編集してください:

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

これは、次とまったく同じである必要があります。

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

ハンドラディスパッチャは、部分文字列ではなく、完全に一致するものを探します。

4

2 に答える 2

4

違いは、$記号が完全に一致したとしてもパターンが別のパターンの部分文字列ではないことを保証することです。URL パターンを照合するには、これら 2 つの正規表現を参照してください。

  1. $ 記号付き: http://regexr.com?327d2

  2. $ 記号なし: http://regexr.com?327d5

そして、これはdjangobookからの抜粋であり、竜巻にも関連している可能性があります:

^hello/$

パターンにはキャレット (^) とドル記号 ($) が含まれます。これらは特別な意味を持つ正規表現文字です。キャレットは「パターンが文字列の先頭に一致する必要がある」ことを意味し、ドル記号は「パターンが文字列の末尾に一致する必要がある」ことを意味します。</p>

この概念は、例によって最もよく説明されます。代わりにパターン '^hello/' (末尾にドル記号なし) を使用した場合、/hello/ だけでなく、/hello/foo や /hello/bar など、/hello/ で始まるすべての URL が一致します。 . 同様に、最初のキャレット文字 ('hello/$') を省略した場合、Django は /foo/bar/hello/ など、hello/ で終わるすべての URL に一致します。キャレットやドル記号を付けずに単に hello/ を使用した場合、/foo/hello/bar など、hello/ を含むすべての URL が一致します。したがって、キャレットとドル記号の両方を使用して、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 に答える