3
votes

Modèle Regex pour valider le chemin du dossier Linux

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 .

Cas de test

Valide / correspond:

  • /
  • /abc
  • /abc/abc/abc/abc

Non valide / ne correspond pas:

  • null ou chaîne vide
  • /abc/
  • /abc/abc/abc/abc/

5 commentaires

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.


3 Réponses :


1
votes

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.


1 commentaires

Aussi, si vous pouvez réellement utiliser le système de fichiers, jetez un œil à ceci



5
votes

Problème avec votre RegEx

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).

Solution possible en utilisant l'expression régulière

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).

Implémentation en code Java:

public boolean isValidLinuxDirectory(String path) {
    Pattern linuxDirectoryPattern = Pattern.compile("^/|(/[a-zA-Z0-9_-]+)+$");
     return path != null && !path.trim().isEmpty() && linuxDirectoryPattern.matcher( path ).matches();
}

Solution alternative utilisant 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-]+)+$

Solution étendue

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:

  1. répertoire-racine /
  2. forme spéciale du répertoire racine //
  3. tout répertoire non racine, dont le nom est composé d'alphas, de nombres, de tirets ou de traits de soulignement (par exemple, / abc / 123 / _abc-123 )

Voir aussi


3 commentaires

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 ( // ) ??



0
votes

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.


0 commentaires