2016-09-06 1 views
1

regex in unserem Projekt haben, dass jede URL übereinstimmt, die die Zeichenfolge „/ pdf /“ enthält: es Regex für Zeichenfolge eine Zeichenfolge enthält, aber nicht eine andere

(.+)/pdf/.+ 

ändern müssen

so, dass es nicht entsprechen Urls, die auch "Hilfe" enthalten

Beispiel:

Sollte nicht überein: "/dealer/help/us/en/pdf/simple.pdf" sollten übereinstimmen: „/ Händler/us/en /pdf/simple.pdf "

+0

Welche Sprache, welcher Regex-Stil, welcher Code wird verwendet, um zu übereinstimmen? –

+0

Der Wert kann ein regulärer Ausdruck im Perl5-Stil sein. –

+0

Kann "Hilfe" nach "/ pdf /" auftreten? Wenn ja, sollte es mit "/dealer/us/en/pdf/help.pdf" übereinstimmen? –

Antwort

1

Wenn lookarounds unterstützt werden, ist dies sehr einfach zu erreichen:

(?=.*/pdf/)(?!.*help)(.+) 

a demo on regex101.com See.

0
(?:^|\s)((?:[^h ]|h(?!elp))+\/pdf\/\S*)(?:$|\s) 

Das erste, was ist Spiel entweder ein Raum oder der Beginn einer Linie

(?:^|\s) 

dann, dass wir nichts gefunden kein oder h OR jede h ist, die nicht elp dahinter hat, eine oder mehrere mal +, bis wir eine /pdf/ finden, dann passen nicht-Leerzeichen Zeichen \S beliebig oft *.

((?:[^h ]|h(?!elp))+\/pdf\/\S*) 

Wenn wir help nach dem /pdf/ erfassen wollen, können wir passende von Anfang an dupliziert werden.

((?:[^h ]|h(?!elp))+\/pdf\/(?:[^h ]|h(?!elp))+) 

Schließlich passen wir eine oder Endlinie/string ($)

(?:$|\s) 

Die vollständige Übereinstimmung gehören führende/nachfolgende Leerzeichen und entfernt werden sollen. Wenn Sie Erfassungsgruppe 1 verwenden, müssen Sie die Enden nicht abisolieren.

Example on regex101

+0

Das ist sehr kompliziert und kann erreicht werden ** weit * * einfacher :) – Jan

+0

@Jan Dies ergibt eine sofort verwendbare Capture-Gruppe, anstatt einer ganzen Zeile zu entsprechen. Außerdem können URLs, die in Text eingebettet sind, oder nur eine Liste von URLs, die nicht durch Zeilenumbrüche getrennt sind, übereinstimmen. – TemporalWolf

Verwandte Themen