Wie kann ich ausschließen, ein Verzeichnis mit regulären Ausdrücken?
Fragte ich eine Frage, vor einer Weile über die Verwendung regulärer Ausdrücke zum extrahieren einer übereinstimmung von einer URL in einem bestimmten Verzeichnis.
zB: www.domain.com/shop/widgets/match/
Die Lösung gegeben war ^/shop.*/([^/]+)/?$
Dieser zurückkehren würde "match"
Jedoch meine Datei Struktur geändert hat und ich brauche jetzt ein Ausdruck, der statt zurück "match"
in jedem Verzeichnis ohne "pages"
und "system"
Im Prinzip brauche ich einen Ausdruck, der zurück "match"
für die folgenden:
www.domain.com/shop/widgets/match/
www.domain.com/match/
Aber nicht:
www.domain.com/pages/widgets/match/
www.domain.com/pages/
www.domain.com/system/widgets/match/
www.domain.com/system/
Ich habe gekämpft, für Tage ohne Glück.
Dank
- warum nicht einfach zwei regex ist die, die Sie jetzt haben, und zu überprüfen, um zu sehen, wenn das Wort "Seiten" oder "system" ist in der URL.
^/shop.*/([^/]+)/?$
würde nicht mitwww.domain.com/shop/widgets/match/
überhaupt. Es würde allerdings passen/shop/widgets
. Könnten Sie/^[a-z0-9.-]+\/shop\/[^\/]+\/([^\/]+)\/$/
extrahieren "match" aus, die URL-segment als\1
. Ich bin entkommen aus der Schrägstriche, weil ich bin auch mit Schrägstrichen als Trennzeichen. Wenn Sie nicht brauchen, Trennzeichen, die Sie nicht brauchen, um zu entkommen Schrägstriche.- Hey, das ist eine gute Idee. Ich werde geben, dass ein zu gehen. Aber ich bin gespannt, wie es fertig, in einem einzigen Ausdruck.
- IMHO oft, wenn ein einzelner regex erfüllt zwei Aufgaben, es ist "clever", aber übermäßig Komplex und sehr schwer zu Lesen. Nur meine zwei Cent.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nur eine alternative zu Grahams große Antwort oben. Code in C# (aber für die regex-Teil, das spielt keine Rolle):
/Hans
BRE und ERE bieten keine Möglichkeit zu negieren, ein Teil des RE, außer innerhalb einer eckigen Klammer Ausdruck. Das heißt, Sie können
[^a-z]
, aber Sie kann nicht Ausdrücken nicht/(abc|def)/
. Wenn deine regex dialiect ist ERE, dann muss Verwendung von zwei regexps. Wenn Sie mit den PREG, können Sie mit einer negative look-ahead.Zum Beispiel, hier sind einige PHP:
Und die Ausgabe:
Ist, dass das, was du suchst?