Valider l'URL de requête avec la regex

Je suis en train de valider une chaîne de requête avec la regex. Notez que je ne suis pas d'essayer de faire correspondre les valeurs, mais de valider sa syntaxe. Je fais cela pour la pratique de la regex, alors je serais heureux d'aider plutôt que de les "utiliser cette lib", bien que vu comment il a pu être fait dans une lib pourrait m'aider, afin de me montrer si vous en avez un.

Donc, ce serait les conditions préalables:

  • Il doit commencer par une questionmark.
  • Il peut contenir des clés avec ou sans valeurs séparées par le signe d'égalité, les couples séparés par une esperluette.

J'ai assez loin, mais j'ai de la difficulté correspondant à regex qui l'est égal à signer et commercial doit être dans un certain ordre, sans avoir à répéter correspondent à des groupes. C'est ce que j'ai obtenu jusqu'à présent:

#^\?([\w\-]+((&|=)([\w\-]+)*)*)?$#

Il correspond bien à ?abc=123&def=345, mais aussi de manière incorrecte correspond par exemple ?abc=123=456.

Je pouvais aller à overkill et faire quelque chose comme...

/^\?([\w\-]+=?([\w\-]+)?(&[\w\-]+(=?[\w\-]*)?)*)?$/

... mais je ne veux pas répéter le match, des groupes qui sont les mêmes de toute façon.

Comment puis-je savoir regex que les séparateurs entre les valeurs devez effectuer une itération entre & et = sans répéter correspondent à des groupes ou catastrophique suivi?

Merci.

Edit:

Je tiens à préciser que ce n'est pas fait pour un monde réel de la mise en œuvre; pour cela, la bibliothèque intégrée dans votre langue, ce qui est plus probable disponibles devraient être utilisés. Cette question est posée parce que je veux améliorer ma regex compétences, et de l'analyse d'une chaîne de requête, semblait un défi gratifiant.

  • Cette question apparaît dans Google sur la requête "chaîne regex" de recherche. Je dois dire que ce qui se passe ici ne doit pas être utilisé en direct même si vous êtes limité à l'expression rationnelle basée sur des solutions, puisqu'elle manque de ceci point et qui sait quoi d'autre (je n'en ai pas, mais il y a beaucoup de morceaux de specs, je ne sais pas).