2016-10-08 6 views
2

Ich möchte die Links von der Zeichenkette, die kein ':' dazwischen haben, trennen und nicht mit '.jpg' oder '.svg' enden und auch mit '/ wiki /' beginnen.Warum funktioniert dieser Regex-Ausdruck nicht?

So sind diese falsch -

"https://boomerrang.com" 
"/wiki/sbsbs:kjanw" 
"/wiki/aswaa:asawsa.jpg" 
"/wiki/awssa.random.jpg" 
"/wiki/boom.jpg" 

Wie das Endergebnis aussehen soll -

"/wiki/justthis" 

Was ich versucht -

r'^/wiki/.*[^:](?!jpg|svg)$' 

Aber es ist nicht richtig bewerten, in der Tat gibt es all das Ergebnis, das ich nicht will ... Ich bin irgendwie Neu bei Regex, also sag mir bitte, warum das nicht funktioniert und wie ich es korrigieren soll.

Dank

+0

Wie sollte das Endergebnis aussehen? – RomanPerekhrest

Antwort

2

Warum Ihr Muster nicht funktioniert:

.*[^:] nicht daran hindert, eine : in der Zeichenfolge zu sein, da es .* mithalten können.

(?!jpg|svg)$ macht keinen Sinn, da es besagt, dass auf das Ende der Zeichenfolge nicht "jpg" oder "svg" folgt. Offensichtlich folgt auf das Ende der Zeichenfolge nichts, da es das Ende der Zeichenfolge ist. Beachten Sie, dass ein Lookarounds (Look-Ahead oder Lookbehind), Anker wie ^, $ oder eine Wortgrenze \b sind Null-Breite Behauptungen und keine Zeichen verbrauchen, so (?!jpg|svg) und $ sind von der gleichen Position in der Zeichenfolge getestet .

Sie können versuchen, dass:

r'^/wiki/[^:]*(?<!\.jpg)(?<!\.svg)$' 

Die beiden negativen Lookbehinds am Ende sicher, dass die Zeichenfolge nicht mit .svg oder .jpg endet.

[^:]* vermeidet alle : in der Zeichenfolge.

+0

Wow, das hat wie ein Zauber funktioniert, kannst du das bitte kurz erklären? Und müssen Sie wirklich nicht vorwärts Schrägstrich im Gegensatz zu dem Vorschlag in den Kommentaren entkommen? – numpy

+0

@numpy: Haben Sie die aktuelle Seite aktualisiert? Über was benötigen Sie insbesondere mehr Informationen? –

+0

@numpy Ich schlage vor, dass Sie diese Regex hier einfügen: http://regex101.com und Sie erhalten eine Aufschlüsselung dessen, was jede Sache tut, und Sie können damit herumspielen, um ein weiteres Verständnis zu haben. – idjaw

Verwandte Themen