J'ai une URL , et j'essaie de la faire correspondre à une expression régulière pour extraire certains groupes. Le problème que j'ai est que l'URL peut se terminer ou continuer avec un "/" et plus de texte URL. Je voudrais faire correspondre des URL comme celle-ci:
Mais ne correspond pas à quelque chose comme ça:
Donc, je pensais que mon meilleur pari était quelque chose comme ça:
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]
où la classe de caractères à la fin contenait le "/" ou la fin de ligne. Cependant, la classe de personnage ne semble pas satisfaite du "$". Comment puis-je distinguer au mieux ces URL tout en retirant les bons groupes?
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
Pour faire correspondre soit/soit la fin du contenu, utilisez (/|\z)
Cela ne s'applique que si vous n'utilisez pas la correspondance sur plusieurs lignes (c'est-à-dire que vous correspondez à une seule URL, pas à une liste d'URL délimitées par des sauts de ligne).
Pour mettre cela avec une version mise à jour de ce que vous aviez:
/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)
Notez que j'ai changé le début en une correspondance non gourmande pour les espaces non blancs (\S+?
) plutôt que de faire correspondre tout et n'importe quoi (.*
)
Vous avez maintenant quelques expressions rationnelles qui feront ce que vous voulez, donc c'est suffisamment couvert.
Ce qui n'a pas été mentionné, c'est pourquoi votre tentative ne fonctionnera pas: à l'intérieur d'une classe de personnage, $
(aussi bien que ^
, .
, et /
) n'a pas de signification particulière, donc [/$]
correspond à un littéral /
ou un littéral $
plutôt que d'arrêter l'expression régulière (/
) ou fin de ligne correspondante ($
).
Dans Ruby et Bash, vous pouvez utiliser $
entre parenthèses.
/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)
(Cette solution est similaire à celle de Pete Boughton, mais conserve l'utilisation de $
, ce qui signifie fin de ligne, plutôt que d'utiliser \z
, ce qui signifie fin de chaîne.)