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();
}
FileNotez le docs sur isDirectory () :
Retours :
truesi et seulement si le fichier désigné par ce chemin abstrait existe et est un répertoire;falsesinon
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.