2012-09-20 50 views
1

我已經看到了一些以Tornado應用程序中的$結尾的URL正則表達式,並被交給了我的團隊......也許我不是最有網絡文化背景的人這對其他人來說是顯而易見的,但我沒有看到它在匹配整個字符串(不在內部搜索)時顯式指示行尾的區別。Tornado中URL模式結尾處的美元符號

有什麼,我失蹤或它只是多餘的?

編輯以更清楚我的意思:

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

,應該是完全一樣的:

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

爲處理器調度查找精確匹配,而不是一個字符串。

+0

這是否幫助(約蟒蛇正則表達式) http://stackoverflow.com/questions/12432934/python-re-vs-html5-re –

+2

不是真的,我已經知道正則表達式是如何工作的,我想知道在Tornado中是否有特殊需求。 – fortran

回答

3

在Tornado中沒有必要追蹤$。我把他們放在習慣之外,因爲我認爲它更清楚,但r"^/hello"只會匹配/你好。

我們可以通過查看URLSpec source看到這一點:

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

區別在於$符號確保模式即使完全匹配也不是其他模式的子字符串。看到這兩個正則表達式匹配url模式。

  1. 與$符號: http://regexr.com?327d2

  2. 沒有$符號: http://regexr.com?327d5

這裏是從djangobook一些摘錄,這可能是相關的龍捲風,以及:

^hello/$

該模式包括脫字號(^)和美元符號($)。這些是 正則表達式字符,它們有特殊含義:該符號意味着「要求該模式匹配字符串的開頭」,並且 美元符號表示「要求該模式匹配 字符串的末尾」。

這個概念最好通過例子來解釋。如果我們使用 模式'^ hello /'(最後沒有美元符號),那麼任何以/ hello /開頭的URL 都可以匹配,例如/ hello/foo和/ hello/bar,而不僅僅是 /你好/。類似地,如果我們放棄了最初的插入符 字符(即'hello/$'),Django將匹配以 hello /結尾的任何URL,例如/ foo/bar/hello /。如果我們只是使用hello /,沒有 插入符號或美元符號,則任何包含hello /的URL都將匹配,如 ,例如/ foo/hello/bar。因此,我們同時使用脫字號和美元符號 確保只有URL/hello /匹配 - 僅此而已,沒有什麼不足。

+0

我認爲Tornado和Django的行爲不同,如果你想匹配任何包含模式的url,你必須明確地在前後添加'。*'。 – fortran

+0

@fortran從我的理解,當你想要使用添加/刪除斜槓裝飾器時添加* –

+1

這是正確的Django,但不是龍捲風。我會添加一個答案。 –