Question

Je dois écrire une expression régulière qui recherche les fichiers javascript correspondant

<anypath><slash>js<slash><anything>.js

Par exemple, cela devrait fonctionner pour les deux:

  • c: \ mysite \ js \ common.js (Windows)
  • /var/www/mysite/js/common.js (UNIX)

Le problème est que le séparateur de fichiers de Windows n'est pas échappé correctement:

pattern = Pattern.compile(
     "^(.+?)" + 
     File.separator +
     "js" +
     File.separator +
     "(.+?).js
java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence
quot; );

Lancer

<*>

Existe-t-il un moyen d'utiliser une expression régulière commune qui fonctionne à la fois sous Windows et sous UNIX?

Était-ce utile?

La solution

Est-ce que Pattern.quote (File.separator) fait l'affaire?

EDIT: Ceci est disponible à partir de Java 1.5 ou ultérieur. Pour la version 1.4, vous devez simplement échapper au caractère séparateur de fichiers:

"\\" + File.separator

Les caractères de ponctuation qui s’échappent ne cassent pas quoi que ce soit, mais les lettres et les chiffres qui s’échappent changent inconditionnellement, leur attribuant une signification particulière ou conduisant à un PatternSyntaxException . (Merci Alan M pour avoir signalé ce problème dans les commentaires!)

Autres conseils

  

Existe-t-il un moyen d'utiliser une expression régulière commune qui fonctionne à la fois sous Windows et sous UNIX?

Oui, utilisez simplement une expression rationnelle qui correspond aux deux types de séparateurs.

pattern = Pattern.compile(
    "^(.+?)" + 
    "[/\\\\]" +
    "js" +
    "[/\\\\]" +
    "(.+?)\\.js<*>quot; );

C’est sûr, car ni Windows ni Unix n’autorisent ces caractères dans un nom de fichier ou de répertoire.

Ne pouvez-vous pas simplement utiliser une barre oblique inversée pour sortir du séparateur de chemin comme ceci:

pattern = Pattern.compile(
     "^(.+?)\\" + 
     File.separator +
     "js\\" +
     File.separator +
     "(.+?).js<*>quot; );

Pourquoi n'échappez-vous pas à File.separator :

... +
"\\" + File.separator +
...

pour répondre aux exigences Pattern.compile ? J'espère " / " (cas unix) est traité comme un """ unique.

J'ai testé la réponse de gimel sur un système Unix - en mettant " \\ " + File.separator fonctionne bien - le résultant "dans le modèle correspond correctement à un seul " "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top