web-dev-qa-db-fra.com

C # - Regex pour les chemins de fichiers, par exemple. C:\test\test.exe

Je suis actuellement à la recherche d'un regex qui puisse aider à valider un chemin de fichier, par exemple:

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

J'ai décidé de poster cette réponse qui utilise une expression régulière.

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

Fonctionne pour ceux-ci:

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

Edit: Exemple d'utilisation ajouté:

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

* Edit: * Ceci est une approximation des chemins que vous pourriez voir. Si possible, il est probablement préférable d'utiliser la classe Path ou la classe FileInfo pour voir si un fichier ou un dossier existe.

27
agent-j

Je recommanderais d'utiliser la classe Path au lieu d'un regex si votre objectif est de travailler avec des noms de fichiers.

Par exemple, vous pouvez appeler Path.GetFullPath pour "vérifier" un chemin, car il déclenchera une variable ArgumentException si le chemin contient des caractères non valides, ainsi que d’autres exceptiosn si le chemin est trop long, etc. toutes les règles, ce qui sera difficile à obtenir avec un regex.

23
Reed Copsey

Ceci est une expression régulière pour les chemins Windows:

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

Et ceci est pour les chemins UNIX/Linux

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

Voici mes tests:

Win Regex

Unix Regex

Ces travaux avec Javascript

EDIT J'ai ajouté des chemins relatifs, (../, ./, ../ quelque chose)

EDIT 2 J'ai ajouté des chemins commençant par tilde pour unix, (~ /, ~, ~/quelque chose)

8
Lemmy4555

Celui proposé n'est pas vraiment bon, celui que je construis pour XSD, c'est spécifique à Windows:

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

Essayez celui-ci pour Windows et Linux: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})

4
ryan

J'utilise cette expression rationnelle pour capturer les chemins de fichiers/dossiers valides dans Windows (y compris les UNC et% variables%), à l'exclusion des chemins racine tels que "C: \" ou "\\ nom_serveur"

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

cette expression rationnelle ne correspond pas aux espaces de début dans les éléments de chemin,

  • "C:\programme de fichiers" correspond
  • "C:\pathWithLeadingSpace" ne correspond pas

les variables sont autorisées à n'importe quel niveau

  • "% program files%" correspond
  • "C:\mon chemin avec les espaces intérieurs \% mon var avec les espaces intérieurs%" correspond
4
Federico Destefanis
regex CmdPrompt("^([A-Z]:[^\<\>\:\"\|\?\*]+)");

Fondamentalement, nous recherchons tout ce qui ne figure pas dans la liste des caractères de chemin d'accès Windows interdits:

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

Réponse d'Alexandre + chemins relatifs

Alexander a la réponse la plus correcte à ce jour, car il prend en charge les espaces dans les noms de fichiers (c'est-à-dire que C:\Program Files (x86)\ correspondra) ... Cela vise également à inclure les chemins relatifs.

Par exemple, vous pouvez faire cd / ou cd \ et il en va de même. 

De plus, si vous êtes actuellement dans C:\some\path\to\some\place et que vous tapez une de ces commandes, vous vous retrouverez à C:\

Encore plus, vous devriez considérer les chemins, qui commencent par '/' en tant que chemin racine (vers le lecteur actuel). 

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

Une version modifiée de la réponse d'Alexander, cependant, inclut les chemins relatifs sans aucun code / ni lettre de lecteur, ainsi que / sans lettre de lecteur avant (relative au lecteur en cours en tant que root).

0
Decoded

J'ai trouvé la plupart des réponses ici pour être un peu hasardeux.

J'ai 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 * - ceci concerne uniquement les partages réseau - pas les fichiers locaux

Réponse:

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