webentwicklung-frage-antwort-db.com.de

Regulärer Ausdruck für gültigen Dateinamen

Ich habe in StackOverflow diesbezüglich schon einige Fragen gestellt, aber in meinem Fall half nichts.

Ich möchte den Benutzer einschränken, um einen Dateinamen anzugeben, der nur alphanumerische Zeichen, -, _, . und Leerzeichen enthalten soll.

Ich bin nicht gut in regulären Ausdrücken und bisher kam mir dieser ^[a-zA-Z0-9.-_]$. Kann mir jemand helfen?

31
VJAI

Dies ist der richtige Ausdruck:

string regex = @"^[\w\-. ]+$";

\w entspricht [0-9a-zA-Z_].

47
Engineer

Um einen Dateinamen zu überprüfen, würde ich vorschlagen, die Funktion von C # anstelle von Regex zu verwenden

if (filename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
{
}
24
Vinoth

Während das, was das OP fragt, dem nahe kommt, was die derzeit akzeptierte Antwort verwendet (^[\w\-. ]+$), gibt es möglicherweise andere, die diese Frage sehen und noch spezifischere Einschränkungen haben.

Zunächst einmal wird \w auf einem Nicht-US/GB-Computer ausgeführt und erlaubt eine Vielzahl unerwünschter Zeichen aus Fremdsprachen, je nach den Einschränkungen des OP.

Zweitens, wenn die Dateinamenerweiterung im Namen enthalten ist, können auf diese Weise alle Arten von seltsam aussehenden, aber gültigen Dateinamen wie file .txt oder file...txt verwendet werden.

Drittens, wenn Sie die Dateien einfach in Ihr Dateisystem hochladen, möchten Sie möglicherweise eine schwarze Liste mit Dateien und/oder Erweiterungen wie diesen:

web.config, Hosts, .gitignore, httpd.conf, .htaccess

Dies ist jedoch für diese Frage nicht geeignet. Für eine gute Anleitung in Sicherheitsfragen sind alle Arten von Informationen über das Setup erforderlich. Ich dachte, ich sollte trotzdem die Angelegenheit ansprechen.

Für eine Lösung, bei der der Benutzer den vollständigen Dateinamen eingeben kann, würde ich Folgendes verwenden:

^[a-zA-Z0-9](?[a-zA-Z0-9 ._-]*[a-zA-Z0-9])?\.[a-zA-Z0-9_-]+$

Es stellt sicher, dass nur das englische Alphabet verwendet wird, keine Anfangs- oder nachgestellten Leerzeichen und die Verwendung einer Dateierweiterung mit mindestens 1 Länge und ohne Leerzeichen.

Ich habe dies auf Regex101 getestet, aber zur späteren Verwendung war dies meine "Testsuite":

## BELOW SHOULD MATCH
web.config
httpd.conf
test.txt
1.1
my long file name.txt

## BELOW SHOULD NOT MATCH - THOUGH VALID
æøå.txt
hosts
.gitignore
.htaccess
7
Johny Skovdal

Für den Fall, dass ein anderer Dateiname (einschließlich von Windows reservierte Wörter und dergleichen) überprüft werden muss, ist hier ein vollständiger Ausdruck: \A(?!(?:COM[0-9]|CON|LPT[0-9]|NUL|PRN|AUX|com[0-9]|con|lpt[0-9]|nul|prn|aux)|[\s\.])[^\\\/:*"?<>|]{1,254}\z

Bearbeiten: Für Interessierte hier ein Link zu Windows-Dateinamenskonventionen: https://msdn.Microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85 ) .aspx

4

Dies ist eine geringfügige Änderung der Antwort von Engineers.

string regex = @"^[\w\- ]+[\w\-. ]*$"

Dies wird ".txt" blockieren, was nicht gültig ist.

Das Problem ist, dass es "..txt" blockiert, was gültig ist

2
Eric

verwenden Sie diesen regulären Ausdruck ^[a-zA-Z0-9._ -]+$

2
burning_LEGION

Ich habe das gerade erstellt. Es verhindert zwei Punkte und einen Punkt am Ende und Anfang. Es erlaubt jedoch keine zwei Punkte.

^([a-zA-Z0-9_]+)\.(?!\.)([a-zA-Z0-9]{1,5})(?<!\.)$
0
luky

Ich kann hier vielleicht etwas Dummes sagen, aber diese Antworten scheinen mir nicht richtig zu sein. Erstens, reden wir hier über Linux oder Windows (oder ein anderes Betriebssystem)?

Zweitens ist es in Windows (meiner Meinung nach) absolut legitim, ein "$" in einen Dateinamen aufzunehmen, ganz zu schweigen von Unicode. Es scheint durchaus möglich zu sein.

Ich habe versucht, eine endgültige Quelle dazu zu finden ... und landete auf der Wikip-Dateiname-Seite : Insbesondere der Abschnitt "Reservierte Zeichen und Wörter" scheint relevant zu sein: und dies sind eindeutig eine Liste von Dingen, die Sie kennen dürfen NICHT einsteigen.

Ich bin in der Java-Welt. Und natürlich ging ich davon aus, dass Apache Commons etwas wie validateFilename hätte, möglicherweise in FilenameUtils..., aber es scheint nicht so zu sein (wenn dies geschehen wäre, wäre dies für C # -Programmierer möglicherweise nützlich, da der Code normalerweise ziemlich leicht zu verstehen ist könnte daher übersetzt werden). Ich habe jedoch ein Experiment durchgeführt, mit der Methode normalize: Zu meiner Enttäuschung erlaubte es völlig ungültige Zeichen (? Usw.), zu "passieren".

Der oben erwähnte Teil der Wikip-Dateiname-Seite zeigt, dass diese Frage von dem verwendeten Betriebssystem abhängt ... aber es sollte möglich sein, einige einfache Regex für Linux und Windows zusammenzustellen. 

Dann habe ich (zumindest) einen Java-Weg gefunden:

Path path = Java.nio.file.FileSystems.getDefault().getPath( 'bobb??::mouse.blip' );

ausgabe:

Java.nio.file.InvalidPathException: Unzulässiges Zeichen bei Index 4: bobb ?? :: mouse.blip

... vermutlich verschiedene FileSystem-Objekte haben unterschiedliche Validierungsregeln

0
mike rodent