Je suis actuellement à la recherche d'un regex qui puisse aider à valider un chemin de fichier, par exemple:
C:\test\test2\test.exe
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.
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.
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:
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)
Celui proposé n'est pas vraiment bon, celui que je construis pour XSD, c'est spécifique à Windows:
^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$
Essayez celui-ci pour Windows et Linux: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})
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,
les variables sont autorisées à n'importe quel niveau
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)
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).
J'ai trouvé la plupart des réponses ici pour être un peu hasardeux.
J'ai trouvé une bonne solution ici:
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
}
}