Quelle est l'expression régulière la plus correcte pour un chemin de fichier UNIX?
Ce qui est le plus correct de l'expression régulière (regex) pour un UNIX chemin d'accès au fichier?
Par exemple, pour détecter quelque chose comme ceci:
/usr/lib/libgccpp.so.1.0.2
Il est assez facile de faire une expression régulière qui correspond à la plupart des fichiers, mais ce qui est le meilleur, y compris celui qui peut détecter échappé espaces séquences, et des personnages insolites vous n'avez pas l'habitude de trouver dans les chemins de fichiers sous UNIX.
Aussi, il y a des fonctions de la bibliothèque dans différents langages de programmation que de fournir un chemin d'accès au fichier regex?
source d'informationauteur Neil | 2009-02-11
Vous devez vous connecter pour publier un commentaire.
Si vous n'avez pas l'esprit de faux positifs pour l'identification des chemins, alors vous avez vraiment besoin pour s'assurer que le chemin ne contient pas un
NUL
caractère; tout le reste est autorisé (en particulier,/
est le nom du caractère de séparation). La meilleure approche serait de résoudre le chemin en utilisant le fichier approprié IO fonction (par exempleFichier.exists()
Fichier.getCanonicalFile()
en Java).Réponse longue:
C'est à la fois système d'exploitation et système de fichiers dépendante. Par exemple, le Wikipédia comparaison des systèmes de fichiers note que, outre les limites imposées par le système de fichiers,
Dans Windows, la les noms de périphérique réservé ne peuvent pas non plus que les noms de fichiers:
La bonne expression régulière pour correspondre à tous les chemins UNIX est: [^\0]+
Qui est, un ou plusieurs caractères qui ne sont pas un NUL.
À d'autres personnes qui ont répondu à cette question, il est important de noter que certaines applications nécessitent un peu différente de l'expression rationnelle, en fonction des caractères d'échappement de travail dans le programme que vous avez écrit. Si vous écriviez un shell, par exemple, et je voulais avoir de commande séparés par des espaces et autres caractères spéciaux, vous devez modifier votre regex pour inclure uniquement les mots avec des caractères spéciaux si ces caractères sont échappés.
Ainsi, par exemple, un chemin d'accès valide serait
par opposition à
qui ferait référence à "/usr/bin/programme" avec les arguments "avec" et "espace"
Une regex pour l'exemple ci-dessus pourrait être "([^\0 ]\|\\ )*"
La regex que j'ai travaillé sur le caractère de saut de ligne séparée pour la "lisibilité"):
Qui se traduit par
De la création de votre propre regex doit être relativement simple, en tant que bien.
Je ne suis pas sûr de la façon commune une regex pour vérifier c'est l'ensemble des systèmes, mais la plupart des langages de programmation (notamment la croix-plate-forme) fournir un "le fichier existe" case qui va prendre ce genre de chose en compte
Par curiosité, où sont ces chemins d'entrée? Pourriez-vous contrôler qu'à une plus grande degrés au point où vous n'aurez pas à vérifier les pièces individuelles de la chemin? Par exemple à l'aide d'un sélecteur de fichier boîte de dialogue?
Ceci permettra d'accepter chaque chemin d'accès qui est juridique dans les systèmes de fichiers tels que extXreiserfs.
Il supprime uniquement les noms de chemin d'accès contenant le NUL ou le double (ou plus) des barres obliques. Tout le reste selon Unix spec devrait être légal (je suis surpris par ce résultat trop).
Question déjà répondu ici: https://stackoverflow.com/a/42036026/1951947