web-dev-qa-db-fra.com

Expression régulière pour un nom de fichier valide

J'ai déjà eu quelques questions à ce sujet dans StackOverflow, mais rien ne m'a beaucoup aidé dans mon cas.

Je souhaite limiter l'utilisateur à un nom de fichier contenant uniquement des caractères alphanumériques, -, _, . et de l'espace.

Je ne suis pas bon dans les expressions régulières et jusqu'à présent, j'ai trouvé ce ^[a-zA-Z0-9.-_]$. Quelqu'un peut m'aider?

31
VJAI

C'est la bonne expression:

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

\w est équivalent à [0-9a-zA-Z_].

47
Engineer

Pour valider un nom de fichier, je suggérerais d'utiliser la fonction fournie par C # plutôt que regex

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

Bien que la question posée par le PO soit proche de celle utilisée par la réponse actuellement acceptée (^[\w\-. ]+$), il est possible que d’autres voient cette question avec des contraintes encore plus spécifiques.

Tout d’abord, exécuté sur une machine non US/GB, \w autorisera une large gamme de caractères indésirables dans des langues étrangères, en fonction des limites de l’OP.

Deuxièmement, si l'extension de fichier est incluse dans le nom, cela permet toutes sortes de noms de fichiers étranges, bien que valides, comme file .txt ou file...txt.

Troisièmement, si vous téléchargez simplement les fichiers sur votre système de fichiers, vous souhaiterez peut-être une liste noire de fichiers et/ou d’extensions de ce type:

web.config, hôtes, .gitignore, httpd.conf, .htaccess

Cependant, cela dépasse considérablement le cadre de cette question; il faudrait toutes sortes d’informations sur la configuration pour bien guider les problèmes de sécurité. J'ai pensé que je devrais néanmoins soulever la question.

Donc, pour une solution où l'utilisateur peut entrer le nom de fichier complet, je choisirais quelque chose comme ceci:

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

Il garantit que seul l'alphabet anglais est utilisé, sans espaces de début ni de fin, et garantit l'utilisation d'une extension de fichier d'au moins 1 longueur et sans espace.

J'ai testé ceci sur Regex101 , mais pour référence future, c'était ma "suite de tests":

## 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

Dans le cas où quelqu'un d'autre aurait besoin de valider les noms de fichiers (y compris les mots réservés Windows et autres), voici une expression complète: \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

Edit: Pour les intéressés, voici un lien vers les conventions de nommage des fichiers Windows: https://msdn.Microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85 ) .aspx

4
Krzysztof Karski

Ceci est un changement mineur dans la réponse des ingénieurs.

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

Cela bloquera ".txt" qui n'est pas valide.

Le problème est que cela bloque le "..txt" qui est valide

2
Eric

utiliser cette expression régulière ^[a-zA-Z0-9._ -]+$

2
burning_LEGION

Je viens de créer cela. Il empêche deux points et un point à la fin et au début. Il ne permet cependant pas deux points.

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

Je dis peut-être quelque chose de stupide ici, mais il me semble que ces réponses ne sont pas correctes. Premièrement, parlons-nous de Linux ou de Windows ici (ou d’un autre système d’exploitation)?

Deuxièmement, sous Windows, il est (je crois) parfaitement légitime d’inclure un "$" dans un nom de fichier, sans parler de l’Unicode en général. Cela semble certainement possible.

J'ai essayé d'obtenir une source définitive sur ce sujet ... et je me suis retrouvé à la page Nom du fichier Wikip : en particulier, la section "Caractères et mots réservés" semble pertinente: il s'agit clairement d'une liste d'éléments ne sont pas autorisés à mettre po.

Je suis dans le monde Java. Et j’ai naturellement supposé qu’Apache Commons aurait quelque chose comme validateFilename, peut-être dans FilenameUtils... mais cela n’apparaît pas pourrait donc être traduit). Cependant, j'ai fait une expérience en utilisant la méthode normalize: à ma grande déception, elle permettait à des caractères parfaitement invalides (?, Etc.) de "réussir".

La partie de la page Wikip Filename mentionnée ci-dessus montre que cette question dépend du système d'exploitation que vous utilisez ... mais il devrait être possible de concocter au moins quelques regex simples pour Linux et Windows. 

Ensuite, j'ai trouvé un moyen Java (au moins):

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

sortie:

Java.nio.file.InvalidPathException: Caractère illégal à l'index 4: bobb ?? :: mouse.blip

... vraisemblablement différents objets FileSystem auront des règles de validation différentes

0
mike rodent