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つ以上の」修飾子を使用しているキャプチャグループ内で名前付きキャプチャを正しく使用する方法はありますか?
問題に直面した人は、 「正規表現を使用します。」と思う人もいます。今、彼らには2つの問題があります。 –
*正規表現に直面している人は、「私が知っていると思うと、私が覚えているキャッチーな引用符を使用します」と思う人もいます。今、彼らは議論に何も加えていません。* - Tomalak –
*これは、正規表現を誤用する人々に対する私の腸の反応です。*--MДΓΓБДLL。 –