it-swarm.com.de

Regex für Dateipfade, z. C:\test\test.exe

Ich suche zurzeit nach einem Regex, der helfen kann, einen Dateipfad zu überprüfen, z.

C:\test\test2\test.exe
20
Dan

Ich entschied mich für diese Antwort, die einen regulären Ausdruck verwendet.

^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$

Funktioniert für diese:

\\test\test$\TEST.xls
\\server\share\folder\myfile.txt
\\server\share\myfile.txt
\\123.123.123.123\share\folder\myfile.txt
c:\folder\myfile.txt
c:\folder\myfileWithoutExtension

Bearbeiten: Beispielverwendung hinzugefügt:

if (Regex.IsMatch (text, @"^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$"))
{
  // Valid
}

* Bearbeiten: * Dies ist eine Annäherung an die Pfade, die Sie sehen konnten. Wenn möglich, ist es wahrscheinlich besser, die Path-Klasse oder die FileInfo-Klasse zu verwenden, um festzustellen, ob eine Datei oder ein Ordner vorhanden ist.

27
agent-j

Ich würde empfehlen, die Path-Klasse anstelle einer Regex-Klasse zu verwenden, wenn Sie mit Dateinamen arbeiten möchten.

Sie können beispielsweise Path.GetFullPath aufrufen, um einen Pfad zu "verifizieren", da eine ArgumentException ausgegeben wird, wenn der Pfad ungültige Zeichen enthält, sowie andere Ausnahmen, wenn der Pfad zu lang ist usw. Dies wird behandelt alle Regeln, die mit einer Regex nur schwer zu korrigieren sind.

23
Reed Copsey

Dies ist ein regulärer Ausdruck für Windows-Pfade:

(^([a-z]|[A-Z]):(?=\\(?![\0-\37<>:"/\\|?*])|\/(?![\0-\37<>:"/\\|?*])|$)|^\\(?=[\\\/][^\0-\37<>:"/\\|?*]+)|^(?=(\\|\/)$)|^\.(?=(\\|\/)$)|^\.\.(?=(\\|\/)$)|^(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+))((\\|\/)[^\0-\37<>:"/\\|?*]+|(\\|\/)$)*()$

Und dies ist für UNIX/Linux-Pfade

^\/$|(^(?=\/)|^\.|^\.\.)(\/(?=[^/\0])[^/\0]+)*\/?$

Hier sind meine Tests:

Regex gewinnen

Unix Regex

Dies funktioniert mit Javascript

EDIT Ich habe relative Pfade hinzugefügt (../, ./, ../something)

EDIT 2 Ich habe Pfade hinzugefügt, die mit Tilde für Unix beginnen ((~ /, ~, ~/etwas).

8
Lemmy4555

Das vorgeschlagene ist nicht wirklich gut, dieses habe ich für XSD gebaut, es ist Windows-spezifisch:

^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$
7
Alexander

Versuchen Sie es mit Windows und Linux: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})

4
ryan

Ich benutze diese Regex zum Erfassen gültiger Datei-/Ordnerpfade in Windows (einschließlich UNCs und% variables%), mit Ausnahme von Stammpfaden wie "C: \" oder "\\ Servername".

^(([a-zA-Z]:|\\\\\w[ \w\.]*)(\\\w[ \w\.]*|\\%[ \w\.]+%+)+|%[ \w\.]+%(\\\w[ \w\.]*|\\%[ \w\.]+%+)*)

dieser reguläre Ausdruck stimmt also nicht mit führenden Leerzeichen in Pfadelementen überein

  • "C:\Programme" stimmt überein
  • "C:\pathWithLeadingSpace" stimmt nicht überein

variablen sind auf jeder Ebene zulässig

  • "% program files%" stimmt überein
  • "C:\mein Pfad mit Innenräumen \% mein Var mit Innenräumen%" wird angepasst
4
regex CmdPrompt("^([A-Z]:[^\<\>\:\"\|\?\*]+)");

Grundsätzlich suchen wir nach allem, was nicht in der Liste der verbotenen Windows-Pfadzeichen steht:

< (less than)
> (greater than)
: (colon)
" (double quote)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
1
Bill

Alexanders Antwort + Relative Pfade

Alexander hat bis jetzt die richtigste Antwort, da er Leerzeichen in Dateinamen unterstützt (d. H. C:\Program Files (x86)\ stimmt überein).

Sie können beispielsweise cd / oder cd \ ausführen, und es tut dasselbe. 

Wenn Sie sich derzeit in C:\some\path\to\some\place befinden und einen dieser Befehle eingeben, landen Sie bei C:\.

Darüber hinaus sollten Sie Pfade berücksichtigen, die mit '/' als Stammpfad (zum aktuellen Laufwerk) beginnen. 

(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/)([^,\/:*\?\<>\"\|]+(\|/){0,1})

In einer modifizierten Version von Alexanders Antwort enthalten wir jedoch Pfade, die relativ ohne führenden / oder Laufwerkbuchstaben sind, sowie / ohne führenden Laufwerksbuchstaben (relativ zum aktuellen Laufwerk als root).

0
Decoded

Ich fand die meisten Antworten hier ein wenig zufällig.

Hier haben wir eine gute Lösung gefunden:

https://social.msdn.Microsoft.com/forums/vstudio/de/31d2bc84-c948-4914-8a9d-97b9e788b341/validate-a-network-folder-path

Hinweis * - Dies gilt nur für Netzwerkfreigaben, nicht für lokale Dateien

Antworten:

string pattern = @"^\\{2}[\w-]+(\\{1}(([\w-][\w-\s]*[\w-]+[$$]?)|([\w-][$$]?$)))+";
string[] names = { @"\\my-network\somelocation", @"\\my-network\\somelocation", 
    @"\\\my-network\somelocation", @"my-network\somelocation",
     @"\\my-network\\somelocation",@"\\my-network\somelocation\aa\dd",
     @"\\my-network\somelocation\",@"\\my-network\\somelocation"};
foreach (string name in names)
{
 if (Regex.IsMatch(name, pattern))
 {
  Console.WriteLine(name);
   //Directory.Exists function to check if file exists
 }
}   
0
Steve