C# - Regex pour les chemins de fichier par exemple C:\test\test.exe
Je suis actuellement à la recherche d'une expression régulière qui peut aider à valider un chemin de fichier par exemple:
C:\test\test2\test.exe
- Vous pouvez poster ce que vous avez essayé jusqu'à présent et quelques échantillons d'entrée et de sortie attendue?
- Avez-vous besoin de l'appui des chemins d'accès UNC comme
\\server\share\file.txt
? - la regex
C:\\test\\test2\\test\.exe
valide votre chemin. - Non, pas vraiment, bien que ne dirais pas non
- Je veux valider un générique chemin, c'était seulement un exemple.
Vous devez vous connecter pour publier un commentaire.
J'ai décidé de poster cette réponse, qui n'est d'utiliser une expression régulière.
Travaux pour ces:
Edit: Ajout d'un exemple d'utilisation:
*Edit: * C'est un rapprochement des chemins que vous avez pu voir. Si possible, il est probablement préférable d'utiliser le Chemin de la classe ou de la classe FileInfo pour voir si un fichier ou un dossier existe.
Regex.IsMatch(@"c:\your folder\sub folder\your file.txt", @"^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$")
c:\banana\..\something.exe
Je vous conseille d'utiliser le Chemin de classe au lieu d'une Regex si votre objectif est de travailler avec des noms de fichiers.
Par exemple, vous pouvez appeler Chemin d'accès.GetFullPath pour "vérifier" un chemin, comme il déclenche une
ArgumentException
si le chemin contient des caractères non valides, ainsi que d'autres exceptiosn si le chemin est trop long, etc. Cela permettra de gérer l'ensemble des règles, ce qui sera difficile à obtenir correct avec une Regex.C'est une expression régulière pour Windows chemins:
Et c'est pour UNIX/Linux chemins
Voici mes tests:
Gagner Regex
Unix Regex
Ces œuvres avec Javascript
MODIFIER
J'ai ajouté des chemins relatifs, (../, ./, ../quelque chose)
EDIT 2
J'ai ajouté des chemins de départ avec un tilde pour unix, (~/, ~, ~/quelque chose)
La proposition de l'un n'est pas vraiment bon, celui que j'construire pour XSD, il est spécifique de Windows:
C:/
(aussi avec une barre oblique inverse). Version fixe:^(?:[A-Z]\:|\.|(?:file\:\/\/|\\\\)[^\\\/\:\*\?\<\>\"\|]+)(?:(?:\\|\/)[^\\\/\:\*\?\<\>\"\|]+)*(?:\\|\/)?$
. Celui-ci fonctionne sous l'hypothèse que dans le cas\\name
,C:\name
, etfile://name
pour toutes les occurences dename
les mêmes règles s'appliquent (c'est à direname
ne peut contenir aucun des caractères de\/:*?<>"|
.Essayez celui-ci pour Windows et Linux:
((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})
J'utilise cette expression pour la capture de fichier valide/les chemins de dossier de windows (y compris les Unc et %variable%), à l'exclusion de les chemins de la racine, comme "C:\" ou "\\serverName"
cette expression ne correspond pas à les espaces dans le chemin d'accès pour les éléments,
variables sont autorisés à n'importe quel niveau
Fondamentalement, nous recherchons tout ce qui n'est pas dans la liste des interdits de Chemin d'accès Windows Caractères:
J'ai trouvé le plus de réponses ici à être un peu frappé ou manquer.
A trouvé une bonne solution ici:
https://social.msdn.microsoft.com/forums/vstudio/en-US/31d2bc84-c948-4914-8a9d-97b9e788b341/validate-a-network-folder-path
Remarque* - ce n'est que pour les partages réseau, pas de fichiers locaux
Réponse:
Alexandre Réponse + les Chemins d'accès Relatifs
Alexander a le plus de bonne réponse à ce jour puisqu'il prend en charge les espaces dans les noms de fichier (c'est à dire
C:\Program Files (x86)\
correspondra)... Ceci vise à inclure les chemins relatifs en tant que bien.Par exemple, vous pouvez faire
cd /
oucd \
et il fait la même chose.De plus, si vous êtes actuellement dans
C:\some\path\to\some\place
et vous tapez l'une de ces commandes, vous vous retrouvez àC:\
Encore plus, vous devriez envisager de chemins, qui commence par '/' comme un chemin de la racine (pour le lecteur en cours).
(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/)([^,\/:*\?\<>\"\|]+(\|/){0,1})
Une version Modifiée d'Alexandre réponse, cependant, nous incluons les chemins sont relatifs à aucun
/
ou lettre de lecteur, ainsi que/
avec pas de lettre de lecteur (par rapport à ce disque en tant que root).