2017-05-19 86 views
1

我使用龍捲風來構建服務器。它是基於Python的,我需要如下操作:

application.add_handlers(r"^(www).*",[ 
    (r"/(.*js$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*xml$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*css$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*jpg$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*png$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*ico$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*html$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 

    (r"/$", IndexHandler), 
]) 

上面的代碼是要告訴一個http請求,它請求資源的位置。所以在這裏我告訴一個http請求,它可以在路徑./static/下獲得js,xml,css,jpg,png,ico和html文件。

它工作得很好,但我不太瞭解正則表達式的一部分。
正如你看到的r"/(.*js$)"是一個正則表達式,它匹配一個http請求。如果http請求正在尋找一個js文件,第一個正則表達式將匹配,但我不知道如何。根據我的理解,如果我想匹配一個js文件,我需要這樣做一個正則表達式:r"/.*(js)$",這意味着以js結尾的文件。我試過了,但它不起作用。

那麼爲什麼(.*js$)工作?這是不是表示以一個字母s而不是js結尾的文件? .*(js)$(.*js$)有什麼區別?而且,^.*abc$,.*abc$,^.*abc,.*(abc)$,^.*(abc)之間的區別是什麼?

我必須誤解或不能理解關於(),^$的一些規則。

+2

什麼你問的是真正的正則表達式的教程。它們已經在線存在:[一般](http://www.regular-expressions.info/tutorial.html),[關於錨點](http://www.regular-expressions.info/anchors.html),[關於組和捕獲](http://www.regular-expressions.info/brackets.html) – viraptor

回答

0

「爲什麼(。* JS $)更多信息工作?`

上述正則表達式匹配任何以js結束,不僅擴展js文件
查看此正則表達式demo的解釋。

要匹配具有js擴展你需要一個文件下面的正則表達式

(.*\.js$) 
+0

好的。這似乎與所謂的工作版本也是一個問題。 – Thilo

+0

@ Yves:你從哪裏得到那個路由表?過度渴望的匹配應該在那裏修復。 – Thilo

0

()之間的部分是作爲捕獲組返回的部分。

您的替代模式僅返回「js」,這對於找到URL的靜態資源並不那麼有用。原始返回完整路徑(減去前導斜槓)。

所以是的,你的模式也與URL相匹配,但是它不會返回解析爲任何靜態資源的路徑(嘗試創建一個名爲static/js的文件,然後看看你是否得到了這個文件)。

1

圓括號()表示捕獲組。
例如如果您的地址是http://www.example.com/something.js
r"/(.*js$)"將匹配和捕捉www.example.com/something.js
r"/.*(js)$"也將匹配,但是隻捕獲JS

我不知道龍捲風是什麼,但我假設它對捕獲的地址做了些什麼,所以如果你沒有得到所有的東西,即使正則表達式匹配,它也不會工作。爲了您的其他問題,嘗試尋找here對基本的正則表達式的含義

+0

非常感謝。龍捲風是構建Web服務器的新框架。它就像tomcat一樣,但非常輕便易學。 – Yves

+0

請注意,'。*'是否在括號內是很重要的,但是在這個例子中,'$'是否是無關緊要的。 '$'是正則表達式中的「零寬度匹配」,所以它對捕獲組沒有任何貢獻。在更復雜的情況下,它可能會影響'$'的位置(例如,如果使用'|')。 –

相關問題