Regulärer Ausdruck zur Überprüfung auf Pfadkonformität

((?<!.)([a-zA-Z]\:\\)(?!\s)(([\w-+.]*((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)(\\?)(?!.))

Eine kleiner Hinweis vorab:

Die RegEx-Engine arbeitet einen String von links nach rechts, Zeichen für Zeichen ab. Eine gefundene Übereinstimmung gemäß dem Suchmuster wird als 'Match' bezeichnet.

 

Ein Pfad in üblicher Schreibweise sieht so aus: C:\abcd\efghi\.

Also: Lw:\ und beliebig oft pfad\.

 

Welche Zeichen darf ein Pfad enthalten?

Es gibt Zeichen, die immer in einem Pfad enthalten sein dürfen und darauf wird mit dem oben stehenden Ausdruck geprüft:

Welche Regeln bestehen für die Zeichen?

Betrachten wir nun die einzelnen Ausdrücke.

Das äußere (grüne) Klammerpaar fasst den Ausdruck als ein Ergebnis zusammen. Das ist wichtig, da sonst auch Teilergebnisse Berücksichtigung finden würden.

 

(?<!.) - ein Lookaround, erst wirksam, wenn ein Match erzielt wurde

?< prüfe vor dem Match
! Negation, das folgende Zeichen darf nicht vorhanden sein
. steht für: jedes Zeichen

Vor dem Match darf kein anderes Zeichen stehen.

([a-zA-Z]\:\\)
[a-zA-Z] alle Kleinbuchstaben a bis z und alle Großbuchstaben A bis Z, einmaliges Auftreten
\: Wenn ein Sonderzeichen als Textzeichen genutzt werden soll, muss ihm ein Backslash vorangestellt werden. Hier ist der Doppelpunkt gesucht.
\\ Das gleiche gilt hier. Es wird nach einem Backslash gesucht.

Ein gefundenes Ergebnis (Match) könnte "c:\" lauten. Erst nachdem dieser Match erzielt wurde, wird der Ausdruck aus der ersten Klammer aktiv und prüft ob vor dem "c:\" kein weiteres Zeichen steht.

(?!\s) - ein Lookaround, nach dem Match
? prüfe nach dem Match
! Negation
\s Space = Leerzeichen

Dem Match darf kein Leerzeichen folgen.

(([\w-+.]*((?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s))*)*)
()*, ()* Der im Klammer-Ausdruck dargestellte String kann beliebig oft auftreten.
( - öffnende Klammer für beliebige Wiederholung
[\w-+.]*
\w Alphanumerische Zeichen (Buchstaben a-z groß/klein, Ziffern, Unterstrich)
- Minus als Zeichen; die eckigen Klammern bilden eine Zeichenklasse. Innerhalb der Zeichenklasse werden "-", "+" und "." als Zeichen ohne Sonderfunktion betrachtet.
+ Plus als Zeichen
. Punkt als Zeichen
optional: Wer unbedingt will kann in diese Klammer zusätzliche Sonderzeichen einfügen. Z.B. Umlaute oder "!", "?". Dann wird ein Pfad, der diese Zeichen enthält auch als 'konform' gewertet.
* Der Ausdruck in der eckigen Klammer findet genau eines dieser Zeichen. Der Stern besagt, dass es beliebig oft auftreten kann. Alle jetzt folgenden Zeichen,die Mitglied dieser Klasse sind, werden somit gefunden.

Erkennt das erste Zeichen im Pfadnamen und eventuelle Wiederholungen davon.

( - öffnende Klammer für beliebige Wiederholung
(?<!\s)(\s{1})(?!\\)|(?<!\\)(\\{1})(?!\s)
| Die Pipe, sie veranlasst die RegEx-Engine den links ODER rechts von der Pipe stehenden Ausdruck zu finden. Wenn mehrere Übereinstimmungen möglich sein sollten, wird immer das zuerst gefundene Ergebnis zurückgeliefert.

Die Ausdrücke links und rechts der Pipe sind gleich gestaltet. Rot ist der eigentliche Match, pink der Lookaround zum Prüfen des Zeichens vor dem Match und cyan der Lookaround zum Prüfen des Zeichens nach dem Match.

linke Seite der Pipe
(?<!\s) - Lookaround vor dem Match
?< prüfe vor dem Match
! Negation
\s Leerzeichen
Vor dem Match darf kein Leerzeichen sein.
(\s{1})
\s Leerzeichen
{1} darf einmal auftreten, Häufigkeit wird in geschweifter Klammer angegeben.
Ein Leerzeichen darf gefunden werden.
(?!\\) - Lookaround nach dem Match
? prüfe nach dem Match
! Negation
\\ Backslash als Zeichen
Dem Match darf kein Backslash folgen.
| - die Pipe

rechte Seite der Pipe

(?<!\\) - Lookaround vor dem Match
?< prüfe vor dem Match
! Negation
\\ Backslash als Zeichen
Vor dem Match darf kein Backslash sein.
(\\{1})
\\ Backslash als Zeichen
{1} darf einmal auftreten, Häufigkeit wird in geschweifter Klammer angegeben.
Ein Backslash darf gefunden werden.
(?!\s) - Lookaround nach dem Match
? prüfe nach dem Match
! Negation
\s Leerzeichen
Dem Match darf kein Leerzeichen folgen.
)* - schließende Klammer für beliebige Wiederholung
)* - schließende Klammer für beliebige Wiederholung
(\\?)
\\ Backslash als Zeichen
? dem Zeichen folgendes Fragezeichen macht dieses optional
Dem Ausdruck kann ein Backslash folgen, muss aber nicht.
(?!.) - Lookaround nach dem Match
? prüfe nach dem Match
! Negation
. jedes Zeichen
Nach dem Match darf kein weiteres Zeichen folgen.

 

Somit gilt: