Regex, um dem URL-Zeilenende oder dem Zeichen „/“ zu entsprechen

80

Ich habe eine URL und 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 folgt abgleichen:

Aber nicht so etwas zusammenbringen:

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 jedoch mit dem "$" dort nicht zufrieden zu sein. Wie kann ich am besten zwischen diesen URLs unterscheiden, während ich immer noch die richtigen Gruppen zurückziehe?

Chris Farmer
quelle

Antworten:

41
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$

1. Erfassungsgruppe (.+)

.+ stimmt mit einem beliebigen Zeichen überein (außer mit Zeilenabschlüssen)

  • + Quantifizierer - Stimmt so oft wie möglich zwischen einer und einer unbegrenzten Anzahl überein und gibt nach Bedarf etwas zurück (gierig)

2. Erfassungsgruppe (\d{4}-\d{2}-\d{2})

\d{4}stimmt mit einer Ziffer überein (gleich [0-9])

  • {4} Quantifier - Spiele genau 4 mal

-passt -buchstäblich zum Zeichen (Groß- und Kleinschreibung beachten)

\d{2}stimmt mit einer Ziffer überein (gleich [0-9])

  • {2} Quantifier - Spiele genau 2 mal

-passt -buchstäblich zum Zeichen (Groß- und Kleinschreibung beachten)

\d{2}stimmt mit einer Ziffer überein (gleich [0-9])

  • {2} Quantifier - Spiele genau 2 mal

-passt -buchstäblich zum Zeichen (Groß- und Kleinschreibung beachten)

3. Erfassungsgruppe (\d+)

\d+stimmt mit einer Ziffer überein (gleich [0-9])

  • + Quantifizierer - Stimmt so oft wie möglich zwischen einer und einer unbegrenzten Anzahl überein und gibt nach Bedarf etwas zurück (gierig)

4. Erfassungsgruppe (.*)?

? Quantifizierer - Stimmt so oft wie möglich zwischen null und einmal überein und gibt nach Bedarf etwas zurück (gierig)

.*stimmt mit einem beliebigen Zeichen überein (außer mit Zeilenabschlüssen)

  • * Quantifizierer - Stimmt so oft wie möglich zwischen null und unbegrenzt überein und gibt nach Bedarf etwas zurück (gierig)

$ Aktiviert die Position am Ende der Zeichenfolge

Adam Tegen
quelle
126

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

Dies gilt nur, wenn Sie keinen mehrzeiligen Abgleich verwenden (dh Sie stimmen mit einer einzelnen URL überein, nicht mit einer durch neue Zeilen getrennten Liste von URLs).


Um das mit einer aktualisierten Version von dem auszudrücken, was Sie hatten:

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

Beachten Sie, dass ich den Start so geändert habe, dass er für nicht-Leerzeichen ( \S+?) nicht gierig ist, anstatt für alles und jedes ( .*).

Peter Boughton
quelle
6
Wie gebe ich dir mehr Punkt;) Danke dafür. Nur zu dokumentieren (/ | \ A) würde mit Schrägstrich oder Zeichenfolgenanfang übereinstimmen.
Senica Gonzalez
Herzlichen Glückwunsch zu Ihrem neuen Gold Answer-Abzeichen;) - Ich habe gerade festgestellt, dass ich Sie auf 100 gebracht habe!
random_user_name
Das \ z-Ding scheint in Javascript nicht zu funktionieren: /
Max Waterman
63

Sie haben jetzt ein paar reguläre Ausdrücke, die tun, was Sie wollen, damit das angemessen abgedeckt ist.

Was wurde nicht erwähnt ist , warum Ihr Versuch wird nicht funktionieren: Innerhalb einer Zeichenklasse $(sowie ^, .und /) hat keine besondere Bedeutung, so [/$]Einstimmungen entweder eine wörtliche /oder eine wörtliche und $nicht zur Einstellung des regex ( /) oder Anpassungs Zeilenende ( $).

Dave Sherohman
quelle
8
Dies wird häufig vergessen und in den Regex-Dokumenten nicht ausreichend erwähnt.
Steve Dunn
6
Beachten Sie, dass ^ in einer Zeichenklasse eine besondere Bedeutung haben kann. Wenn es das erste Zeichen in der Klasse ist, wird es zu einer negativen Klasse, die mit allen anderen Zeichen übereinstimmt. Um beispielsweise etwas anderes als a oder b zu finden, können Sie [^ ab] verwenden. Um ein Literal ^ einzuschließen, stellen Sie einfach sicher, dass es nicht das erste ist. Um also entweder a, b oder ^ zu finden, würden Sie [ab ^] verwenden.
David Mason
18

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 das Ende der Zeile bedeutet, und nicht die Verwendung von \z, was das Ende der Zeichenfolge bedeutet.)

Sparhawk
quelle
2
PHP auch von dem, was ich sagen kann. Ich sehe keinen Grund, warum in keiner Implementierung tatsächlich $in Klammern verwendet werden ()kann. Es sind die Klammern [], die es wörtlich machen.
Joel Mellon
3
$funktioniert auf diese Weise in Javascript, wohingegen \zdies nicht der Fall ist (Chrome 48, Firefox 43, IE9).
Wsewolod Golowanow
1
Dies ist die einfachste Option. Match-Schrägstrich oder Zeilenende. Es passt sogar zum Titel dieser Frage!
Brett Donald