0

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 つのオブジェクトを含む配列を期待していましalbumssongs

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

4

2 に答える 2

0

「再帰」は、あなたが抱えている問題に対して実際には正しい言葉ではありません。/resource/id正規表現内の複数のペアを反復処理し、後で個々のキャプチャを取得しようとしています。代わりにこの正規表現を使用することをお勧めします。

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

...そして、コード内のペアを繰り返し処理し/resource/idます(たとえば、scanメソッドを使用して)。

于 2012-04-07T16:15:58.437 に答える
0

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

于 2012-04-07T15:19:50.603 に答える