2012-04-07 14 views
0

Rubyで正規表現を使用して標準のRESTful URIを分解しようとしています。再帰的な名前付きキャプチャ:RESTfulなURIの解析

私たちは、音楽ディスコグラフィWebアプリケーションに取り組んでいるとします。私たちには多くのアルバムがあり、多くのソングを持っているアーティストがたくさんいます。この設定で

、以下のRESTfulなURIは、すべてのGETリクエストとして利用可能であるべきである:正規表現を使用してこれらのURIをキャプチャする試みにおいて

/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 

、私は(live example)以下を手早く:

^\/(?<resource>(?:artists|albums|songs))(?:\/(?<id>\d+))?\/?$ 
以下のようなルートレベルのリソースを指定された場合

、正規表現作品が期待とおり

最初に生成されるマッチデータは、artistsのリソースとnilのリソースを持ち、2番目のリソースはsongsのリソースと1のリソースを持っています。

しかし、/albums/1/songs/1などのリソースの関連付けを要求するURIが指定されている場合、この正規表現は再帰を考慮しないため失敗します。

^(?:\/(?<resource>artists|albums|songs)(?:\/(?<identifier>\d+))?)+\/?$ 

この正規表現現在、/albums/1/songs/2などのURIに動作しますが、結果としてmatchdataしか含まれています。だから、私は「一つ以上」を持つグループ(+)その上に修飾子が非キャプチャで全部を投げました最後のリソース(songs)とID(2)。
2つのオブジェクト(リソースがalbums、リソースがsongs)を含む配列が必要です。

「1つ以上の」修飾子を使用しているキャプチャグループ内で名前付きキャプチャを正しく使用する方法はありますか?

+0

問題に直面した人は、 「正規表現を使用します。」と思う人もいます。今、彼らには2つの問題があります。 –

+4

*正規表現に直面している人は、「私が知っていると思うと、私が覚えているキャッチーな引用符を使用します」と思う人もいます。今、彼らは議論に何も加えていません。* - Tomalak –

+0

*これは、正規表現を誤用する人々に対する私の腸の反応です。*--MДΓΓБДLL。 –

答えて

0

ほとんどの正規表現のフレーバーはそのように機能しません。各キャプチャグループには、一致した最後の部分文字列のみが含まれます。 .NET regex libを使用しない限り、キャプチャグループのすべての一致を覚えています。

0

"再帰"は、実際に問題の正しい単語ではありません。正規表現で複数の/resource/idペアを反復処理してから、後で個々のキャプチャを取得しようとしています。

\/(?<resource>artists|albums|songs)(?:\/(?<identifier>\d+))? 

...そして、あなたのコード内で/resource/idペア(例えば、scan方法)を反復処理:私はあなたの代わりに、この正規表現を使用することをお勧め。

+0

その問題は、例えば '/ song/1foo/bar'がまだ一致していることです。したがって、事前検証ステップが必要です。または、 '\ G'を使用して、マッチ位置がすべてのマッチの後であることを確認します。 – Qtax