我試圖在Ruby中使用正則表達式來分解標準RESTful URI。遞歸命名捕獲:解析RESTful URI
假設我們正在製作音樂唱片公司的Web應用程序。我們有許多藝術家,其中有很多專輯,有許多歌曲。
採用這種設置,下面的RESTful的URI應該都可以作爲GET請求:
/artists
/artists/1
/artists/1/albums
/artists/1/albums/1
/artists/1/albums/1/songs
/artists/1/albums/1/songs/1
/artists/1/albums/1/songs/1/artists
/artists/1/albums/1/songs/1/artists/1
在試圖捕捉使用正則表達式這些URI,我颳起了以下(live example):
^\/(?<resource>(?:artists|albums|songs))(?:\/(?<id>\d+))?\/?$
當給定一個根級的資源,如下面的正則表達式作品預計:
/artists
/songs/1
第一個結果匹配數據的資源爲artists
,ID爲nil
,第二個資源爲songs
,ID爲1
。
但是,當給定一個URI請求資源的關聯,如/albums/1/songs/1
,這個正則表達式將失敗,因爲如果不考慮遞歸。所以,我把整個事情在非捕獲組以「一個或多個」(+
)就可以了預選賽:
^(?:\/(?<resource>artists|albums|songs)(?:\/(?<identifier>\d+))?)+\/?$
這個規則表達式現在能對URI的如/albums/1/songs/2
但由此產生的matchdata只包含最後資源(songs
)和id(2
)。
我在期待一個包含兩個對象的數組,其中一個的資源爲albums
,另一個的資源爲songs
。
在正在使用「一個或多個」限定符的捕獲組中有正確使用命名捕獲的方法嗎?
有些人在遇到問題時,認爲 「我知道,我會用正則表達式。」現在他們有兩個問題。 – 2012-04-07 14:41:35
*有些人遇到正則表達式時,會想「我知道,我會用我記得的引人入勝的引語」。 * - Tomalak – 2012-04-07 15:12:10
*無論如何,這只是我對濫用正則表達式的人的直覺反應。* --MITTYБДLL。 – 2012-04-07 17:41:38