it-swarm.com.de

Regex, um mit dem URL-Zeilenende- oder "/" -Zeichen übereinzustimmen

Ich habe eine URL , und ich versuche, sie einem regulären Ausdruck zuzuordnen, um einige Gruppen herauszuholen. Das Problem, das ich habe, ist, dass die URL entweder mit einem "/" und mehr URL-Text enden oder fortfahren kann. Ich möchte URLs wie diese zuordnen:

Aber nicht mit so etwas übereinstimmen:

Also dachte ich, meine beste Wette wäre so etwas:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]

wobei die Zeichenklasse am Ende entweder das "/" oder das Zeilenende enthielt. Die Charakterklasse scheint mit dem "$" dort allerdings nicht zufrieden zu sein. Wie kann ich zwischen diesen URLs am besten unterscheiden, während ich die richtigen Gruppen zurückziehe?

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

Verwenden Sie (/|\z), Um entweder oder das Ende des Inhalts abzugleichen.

Dies gilt nur, wenn Sie keinen mehrzeiligen Abgleich verwenden (d. H. Sie stimmen mit einer einzelnen URL überein, nicht mit einer durch Zeilenumbrüche getrennten Liste von URLs).


Um das mit einer aktualisierten Version von dem zu sagen, was Sie hatten:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)

Beachten Sie, dass ich den Start so geändert habe, dass er ein nicht gieriges Match für Nicht-Leerzeichen ist (\S+?), Anstatt alles und jeden zu finden (.*).

108
Peter Boughton

Sie haben jetzt ein paar reguläre Ausdrücke, die tun, was Sie wollen.

Was nicht erwähnt wurde, ist, warum dein Versuch nicht funktioniert: Innerhalb einer Charakterklasse, $ (ebenso gut wie ^, ., und /) hat keine besondere Bedeutung, also [/$] entspricht entweder einem Literal / oder ein wörtliches $ anstatt den regulären Ausdruck zu beenden (/) oder passendes Zeilenende ($).

55
Dave Sherohman

In Ruby und Bash können Sie $ In Klammern verwenden.

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)

(Diese Lösung ähnelt der von Pete Boughton, behält jedoch die Verwendung von $ Bei, was Zeilenende bedeutet, anstatt \z, Was Zeichenfolgeende bedeutet.)

16
Sparhawk