IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

regex et exclusion de chaîne


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut regex et exclusion de chaîne
    Bonjour,

    Voilà, je suis en train de coder une classe qui permet de remplacer dans un fichiers des variables par leur valeur disponible dans mon programme.
    J'offre la possibilité de choisir les délimiteurs de début et de fin des variables dans le fichier. Par exemple, je veux ma variable soit encadrée par "${" et "}", et avoir un fichier du genre :
    Donc, dans ma classe, dans un premier temps, j'ai utilisé le pattern "\\$\\{.*\\}". Le problème est que si j'ai deux variables sur la même ligne dans mon fichier, je ne capture qu'un seul élément. Il faut donc que j'exclue à l'intérieur de mes délimiteur la chaîne de fermeture.

    Dans mon exemple, c'est facile, mon pattern devient "\\$\\{[^}]*\\}". Mais comme je veux laisser le choix pour les délimiteurs, que faire si le délimiteur de fin comporte plusieurs caractères ?

    Après quelques recherches, il ne semble pas possible d'exclure une chaîne dans une regex. La solution est de faire des combinaisons un peu siouxes. Genre, si les délimiteurs sont "/-" et "-/", la regexp pourrait être (à la louche) :
    Mais est-ce que c'est vraiment réalisable pour tout type de délimiteurs ?
    Est-ce que une lib quelconque existe déjà et fait tout ça ?
    Est-ce que je ne devrait pas m'embêter et restreindre le délimiteur de fin à un caractère ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a une solution beaucoup plus simple : utiliser les "reluctant quantifiers" à la place des "greedy quantifiers" :

    • .* est "greedy quantifiers" qui recherchera la chaine correspondante la plus grande, ce qui te pose problème
    • .*? (note le ? supplémentaire) est un "reluctant quantifiers" qui recherchera la chaine correspondante la plus courte, ce qui convient parfaitement à ton cas


    Exemple avec la chaine "${a} text ${b}" le pattern "\\$\\{.*\\}" te retournera un seul élément correspondant à l'ensemble de la chaine, alors que le pattern "\\$\\{.*?\\}" te retournera bien les deux éléments ${a} et ${b}


    Enfin dernière remarque, plutôt que de protéger les caractères un à un avec des \\ tu peux utiliser Pattern.quote().

    Au final tu peux construire ton pattern de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String debut = "${";
    String fin = "}";
    String pattern = Pattern.quote(debut) + ".*?" + Pattern.quote(fin);
    a++

  3. #3
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Tout ça dans un seul message !

    Merci beaucoup pour toutes ces solutions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Expression régulière] exclusion de chaînes
    Par beekeep dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 18/09/2008, 22h58
  2. [RegEx] Regex pour récupérer une chaîne de 6 chiffres
    Par calitom dans le forum Langage
    Réponses: 5
    Dernier message: 12/06/2008, 21h37
  3. [Regex] Découpage d'une chaîne en groupes
    Par La Truffe dans le forum Langage
    Réponses: 2
    Dernier message: 12/03/2008, 14h36
  4. [Regex] Comment tester une chaîne ASCII 7bits ?
    Par Raduris dans le forum Framework .NET
    Réponses: 4
    Dernier message: 27/03/2006, 09h42
  5. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo