Ich versuche einen standardmäßigen RESTful URI mit regulären Ausdrücken in Ruby zu zerlegen.Rekursive Named Captures: Parsing eines RESTful URI
Angenommen, wir arbeiten an einer Musik-Diskographie-Webanwendung. Wir haben viele Künstler, die viele Alben haben, die viele Lieder haben.
Mit dieser Einrichtung alle folgenden RESTful URIs sollten als GET-Anfragen zur Verfügung:
/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
In einem Versuch, diese URIs mit Regexp zu erfassen, ich folgendes (live example) peitschte:
^\/(?<resource>(?:artists|albums|songs))(?:\/(?<id>\d+))?\/?$
Wenn eine root-Ebene-Ressource, wie nachfolgend angegeben, die regexp arbeitet wie erwartet:
/artists
/songs/1
Die ersten resultierenden Matchdata haben eine Ressource von artists
und eine ID von nil
und die zweite hat eine Ressource von songs
und eine ID von 1
.
Wenn jedoch ein URI angegeben wird, der Zuordnungen einer Ressource anfordert, wie /albums/1/songs/1
, schlägt diese Regexp fehl, weil Rekursion nicht berücksichtigt wird. Also warf ich das Ganze in einer nicht-einfangende Gruppe mit ein ‚ein oder mehr‘ (+
) Qualifier darauf:
^(?:\/(?<resource>artists|albums|songs)(?:\/(?<identifier>\d+))?)+\/?$
Diese regexp funktioniert jetzt auch auf URIs wie /albums/1/songs/2
aber die resultierende Match enthält nur die letzte Ressource (songs
) und ID (2
).
Ich erwartete ein Array mit zwei Objekten, eines mit einer Ressource von albums
und eines mit einer Ressource von songs
.
Gibt es eine Möglichkeit, benannte Captures innerhalb einer Erfassungsgruppe korrekt zu verwenden, die den "einen oder mehrere" Qualifier verwendet?
Einige Leute, wenn sie mit einem Problem konfrontiert sind, denken "Ich weiß, ich werde reguläre Ausdrücke verwenden.". Jetzt haben sie zwei Probleme. –
* Und einige Leute denken, wenn sie mit regulären Ausdrücken konfrontiert werden: "Ich weiß, ich werde ein einprägsames Zitat verwenden, an das ich mich erinnere". Jetzt haben sie nichts zur Diskussion hinzugefügt. * - Tomalak –
* Auf jeden Fall ist das nur meine Bauchreaktion auf Leute, die Regexes missbrauchen. * - MÄDCHEN. –