Ruby で正規表現を使用して、標準の 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
Regexp を使用してこれらの URI をキャプチャしようとして、次のように作成しました ( live example )。
^\/(?<resource>(?:artists|albums|songs))(?:\/(?<id>\d+))?\/?$
次のようなルートレベルのリソースを指定すると、正規表現は期待どおりに機能します。
/artists
/songs/1
最初の結果の matchdata には のリソースartists
と の ID がnil
あり、2 番目の結果には のリソースsongs
と の ID があり1
ます。
しかし、 などのリソースの関連付けを要求する URI が指定された場合/albums/1/songs/1
、この正規表現は失敗します。+
そのため、「1 つ以上」の ( ) 修飾子を使用して、すべてを非キャプチャ グループに入れました。
^(?:\/(?<resource>artists|albums|songs)(?:\/(?<identifier>\d+))?)+\/?$
この正規表現は などの URI で機能するようになりまし/albums/1/songs/2
たが、結果の matchdata には最後のリソース ( songs
) と id ( 2
) のみが含まれます。
私は 2 つのオブジェクトを含む配列を期待していましalbums
たsongs
。
「1 つ以上」修飾子を使用しているキャプチャ グループ内で名前付きキャプチャを適切に使用する方法はありますか?