web-dev-qa-db-fra.com

Regex pour faire correspondre l'URL de fin de ligne ou le caractère "/"

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?

70
Chris Farmer
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
39
Adam Tegen

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 (.*)

108
Peter Boughton

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 ($).

55
Dave Sherohman

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.)

16
Sparhawk