Utilisation de JAVA. J'essaie de trouver un moyen plus élégant de valider un chemin de dossier Linux (sans inclure le nom de fichier).
Voici ce que j'ai jusqu'à présent: "^ \\ / $ | ^ ((\\ / ([a-zA-Z0-9 _-] +)) +) $"
< / p>
Les chemins de dossier ne doivent inclure que les caractères suivants: lettres , chiffres , tirets ou trait de soulignement . p >
Valide / correspond:
/
/abc
/abc/abc/abc/abc
Non valide / ne correspond pas:
/abc/
/abc/abc/abc/abc/
3 Réponses :
Et voilà:
\/[a-zA-Z0-9_\/- *[^\/ $
< EDIT
Le premier caractère correspond à une barre oblique /
. Le groupe de caractères suivant correspond à a-z, A-Z, 0-9, des traits de soulignement, des barres obliques et des tirets (tous les caractères de répertoire et de nom de fichier acceptés). L'astérisque suivant fait correspondre le modèle à ce groupe de caractères 0 fois ou plus (donc n'importe quelle combinaison de ces caractères). Le dernier groupe de caractères a une négation ^
signifiant qu'il correspond à tout SAUF ce qui est dans le groupe de caractères, étant la dernière barre oblique que nous ne voulons pas faire correspondre. Enfin le $
pour terminer la chaîne.
Aussi, si vous pouvez réellement utiliser le système de fichiers, jetez un œil à ceci
Le RegEx fourni travaille sur les cas de test.
Vous pouvez même le réduire en supprimant les contre-obliques \\
et la paire extérieure de parenthèses. Begin ^
et end $
ne sont nécessaires qu'une seule fois (autour des deux alternatives).
Vous peut tester le RegEx sur RegexPlanet.com (cliquez sur Java -Bouton pour les tests)
^/|//|(/[\w-]+)+$
ou équivalent (voir démo sur RegexPlanet )
public boolean isValidExistingDirectory(String path) { if (path == null || path.trim().isEmpty()) return false; File file = new File( path ); return file.isDirectory(); }
Expliqué:
\ w
correspond à un caractère-mot (identique à [a-zA-Z0-9_]
, ne correspondant pas au dash).
public boolean isValidLinuxDirectory(String path) { Pattern linuxDirectoryPattern = Pattern.compile("^/|(/[a-zA-Z0-9_-]+)+$"); return path != null && !path.trim().isEmpty() && linuxDirectoryPattern.matcher( path ).matches(); }
File
Notez le docs sur isDirectory () :
Retours :
true
si et seulement si le fichier désigné par ce chemin abstrait existe et est un répertoire;false
sinon
Il ne peut donc valider vos exigences (dossier Linux valide) que s'il est exécuté sur une machine Linux et si le dossier / répertoire existe.
^/|(/[\w-]+)+$
Comme indiqué dans le commentaire, la forme spéciale de racine //
doit également être valide. Ensuite, utilisez ce RegEx:
^/|(/[a-zA-Z0-9_-]+)+$
Il prend en charge:
/
//
/ abc / 123 / _abc-123
) Merci beaucoup! Très utile!
^ / | / [a-zA-Z0-9 _-] +) + $
ne fonctionne pas dans le cas où le chemin du dossier est //
. ^ / $ | ^ (/ [a-zA-Z0-9 _-] +) + $
fonctionne.
@afrey OK. Alors s'il vous plaît METTEZ À JOUR votre question pour une exigence étendue (comme je viens de le faire). Assurez-vous que votre expression régulière ^ / $ | ^ (/ [a-zA-Z0-9 _-] +) + $
correspond à la racine spéciale ( //
) ??
Pour couvrir tous les cas, y compris le répertoire racine, vous aurez besoin des éléments suivants:
^\/$|(\/[a-zA-Z_0-9-]+)+$
Voir Démo Regex en utilisant des modificateurs globaux et multilignes.
Eh bien, la manière élégante serait de ne pas utiliser du tout regex et d'utiliser à la place les bibliothèques nio pour déterminer si le chemin est valide ...
Quel est le cas d'utilisation de votre validation? Pourquoi votre RegEx ne fonctionne pas pour vous? Peut-être que nous pouvons trouver une meilleure solution en plus d'utiliser le RegEx :)
Mon modèle fonctionne, il a juste l'air maladroit et je n'étais pas sûr de le faire correctement.
Pourquoi limitez-vous les noms de dossier à des caractères alphanumériques? Un nom de dossier peut contenir près de n'importe quel caractère.
Utilisation uniquement alphanumérique en raison des exigences de l'application que nous utilisons.