2016-09-24 1 views
1

Ich hatte eine Anforderung der Analyse einer Reihe von URLs und Extrahieren bestimmter Elemente aus URLs unter besonderen Bedingungen. Um zu erklären, es weiter, sollten Sie eine Reihe von Urls:JS Regex: Parse URLs mit Bedingungen

http://www.example.com/appName1/some/extra/parts/keyword/rest/of/the/url http://www.somewebsite.com/appName2/some/extra/parts/keyword/rest/of/the/url http://www.someothersite.com/appname3/rest/of/the/url

Wie Sie sehen können, gibt es zwei Sätze von Urls, man das Wort „Stichwort“ drin hat und andere, die das nicht tun. In meinem Code erhalte ich den Teil der URL nach dem Domain-Namen (zB:/appName1/einige/extra/teile/keyword/rest/of/the/url).

Ich habe zwei Aufgaben, eine Überprüfung, ob das Wort "Schlüsselwort" in der URL vorhanden ist, und zweitens, nur wenn "Schlüsselwort" nicht in URL vorhanden ist, parse die URL, um die beiden Gruppen als abzurufen appName und Rest der URL (zB: grp 1. appName3 und grp 2. Rest/von/die/URL für URL 3, da es kein "Schlüsselwort" darin hat). Das Ganze sollte in einem Regex gemacht werden.

Mein Fortschritt:

  • konnte ich den Namen der Anwendung und der Rest der URL in Gruppen analysieren, war aber nicht in der Lage, den Zustand zu übernehmen.

  • ich einen Weg Stiche auswählen zu müssen „Schlüsselwort“ nicht darin fand heraus, ich bin nicht sicher, ob es der richtige Weg ist, es zu tun: ^((?!.\*keyword).\*)$

  • nächsten die beide oben genannten zu kombinieren, habe ich versucht, etwas, das ich nach einer langen Suche gefunden habe, die die Syntax (?(?=regex)then|else)Reference hat. Und das Ergebnis war:
    (?(?=^((?!.*keyword).*)$)\1)
    Aber es sagt ungültigen Gruppenstruktur.

Ich hatte viele stackoverflow-Einträge und Tutorials durchlaufen, konnte aber die tatsächliche Anforderung nicht erreichen. Bitte hilf mir, das zu lösen.

+0

_“einfängt Ich habe zwei Aufgaben "_ Was ist zweite Aufgabe? – guest271314

+0

Gruppieren Sie die Komponenten basierend auf dem Ergebnis der ersten Aufgabe (Filter-URLs ohne Schlüsselwort). Tut mir leid, dass ich nicht klar bin, ich habe meine Frage bearbeitet. – T90

+0

Wenn "Schlüsselwort" in der Zeichenfolge ist, tun Sie nichts? – guest271314

Antwort

1

Ja, das ist tatsächlich möglich. Soweit ich verstehe, haben Sie folgende Fälle:

  • /appName/some/extra/parts/keyword/rest/of/the/url
  • /appName/rest/of/the/url

Sie möchten Ihre regex überhaupt die erste nicht übereinstimmen, während im zweiten Fall, dass Sie "wollen appName "in einer Gruppe und" rest/of/the/url "in einer anderen. Die folgende Regex tun:

^(?!.*\/keyword\/)\/(.*?)\/(.*)$ 

Erläuterung:

  • ^ assert Position zu Beginn des string`
  • (?!.*\/keyword\/) ein negativer Look-Ahead ist, und schaut nach vorn die Zeichenfolge, um sicherzustellen, tut nicht enthalten/Schlüsselwort /. Dies ist, wo die Magie passiert
  • \/ passt "/", d.h.der Schrägstrich direkt nach dem Domainnamen
  • (.*?)\/ die erste Gruppe erfaßt (appname in Ihrem Beispiel) Gierig bis zum nächsten Slash
  • (.*)$ ist die Gruppe, die "Ruhe/von/dem/url"
+0

Hallo @ Mathias-S, ich habe das versucht, aber es scheint, dass es Gruppen zurückgibt, selbst wenn es "Schlüsselwort" darin gibt. Ich bin mir nicht sicher, ob die Anforderung klar war. Wenn "Schlüsselwort" in der URL vorhanden ist, sollte es keine Gruppen zurückgeben. – T90

+0

Wenn also ein Schlüsselwort vorhanden ist, möchten Sie die gesamte URL abrufen, wenn sie nicht vorhanden ist, möchten Sie die Gruppen? Oder willst du überhaupt nichts, wenn ein Keyword vorhanden ist? –

+0

wenn Stichwort vorhanden ist, ich will nichts, und wenn er nicht da ist, die Gruppen – T90