Ich suche zurzeit nach einem Regex, der helfen kann, einen Dateipfad zu überprüfen, z.
C:\test\test2\test.exe
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.
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.
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:
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).
Das vorgeschlagene ist nicht wirklich gut, dieses habe ich für XSD gebaut, es ist Windows-spezifisch:
^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$
Versuchen Sie es mit Windows und Linux: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})
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
variablen sind auf jeder Ebene zulässig
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)
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).
Ich fand die meisten Antworten hier ein wenig zufällig.
Hier haben wir eine gute Lösung gefunden:
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
}
}