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

Langage Java Discussion :

[RegExp]expression régulière:while (match.find) ou if


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut [RegExp]expression régulière:while (match.find) ou if
    Bonjour,
    J'ai un problème avec un while et un if dans les expressions régulières.
    Quand l'expression régulière est retrouvée dans un texte, je modifie le texte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Iterator it = liste.iteration();
    while (it.hasNext()) {
    	s = (String)it.next();
    	Pattern regex = Pattern.compile("\\W"+s+"\\W");
    	Matcher match = regex.matcher(contenu);
    	while (match.find()){
    		String matchFound = match.group();
    		String matchFoundmodif = "(\\Q"+matchFound+"\\E)";
    		contenu = contenu.replaceAll(matchFoundmodif , "<font style bgcolor=\"#33CCFF\"> #titre# "+matchFound+" ##titre## </font>");
    	}
    }
    Si je mets (comme ici) while (match.find()), alors
    si s=bonjour, et que dans le texte il y a 2 fois bonjour, alors ce sera écrit: #titre##titre#bonjour##titre####titre##
    =>il y a autant de fois #titre# et ##titre## qui entourent le mot qu'il y a d'occurences de ce mot dans le texte entier. => pas OK
    Si je mets boolean b = match.find() suivi de if (b==true), alors certains mots ne sont pas surlignés. => pas OK

    Je suppose que tout ça a un rapport avec le while et le if. Mais je ne vois pas comment faire pour avoir tous les mots qu'il faut, surlignés et encadrés seulement une fois par #titre# et ##titre##.
    Merci


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    La multiplication de tes balises est normale puisqu'il va remplacer toutes les occurences à chaque fois qu'il va en trouver une. Donc tu ne peux pas utiliser le while.

    Par contre je ne vois pas pqoi le if ne marcherai pas. Donne voir ton code avec ton "if".
    Tu dis qu'il ne surligne pas tous les mots. Ca veut dire que s'il y a plusieurs fois le mot bonjour, il va en surligner certains et pas d'autre alors que le while les surlignai tous?
    Etrange

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    slt,

    Avec le if, les mots qui sont suivis d'une parenthèse dans le texte ne sont pas surlignés alors qu'avec le while, ils le sont. Je n'ai vu que ce cas là où ça ne fonctionne pas, mais peut etre qu'il y a d'autres cas. Je regarderai demain car je n'ai plus le code avec moi ce soir.

    Je mets la version avec le if:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Iterator it = liste.iteration(); 
    while (it.hasNext()) { 
       s = (String)it.next(); 
       Pattern regex = Pattern.compile("\\W"+s+"\\W"); 
       Matcher match = regex.matcher(contenu); 
       boolean b =match.find();
       if (b==true){ 
          String matchFound = match.group(); 
          String matchFoundmodif = "(\\Q"+matchFound+"\\E)"; 
          contenu = contenu.replaceAll(matchFoundmodif , "<font style bgcolor=\"#33CCFF\"> #titre# "+matchFound+" ##titre## </font>"); 
       } 
    }

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    J'ai fait plusieurs tests avec le if et j'en ai conclu que:
    si un mot de la liste apparait, pour la 1ere fois dans le texte, encadré par certains caractères non mots, alors il faut obligatoirement que dans le reste du texte, ce mot apparaisse encadré avec les memes caractères spéciaux et pas avec d'autres.

    Exemple: un des mots de la liste est "mot"

    texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le mot à chercher est un mot de 5 lettres
    "mot" apparait 2 fois.
    Dans les 2 cas, il apparait de la meme façon (un espace avant et après)
    Alors les 2 occurences de "mot" sont surlignées
    => OK

    texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le mot à chercher ,mot de 5 lettres
    "mot" apparait 2 fois
    Mais la 1ere fois, on a un espace avant et après, alors que pour la 2eme occurence, on a une virgule avant et un espace après.
    Alors seule la 1ère occurence de "mot" est surlignée
    => pas OK

    texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le ,mot à chercher mot de 5 lettres
    "mot" apparait 2 fois
    Mais la 1ere fois, on a une virgule avant et un espace après, alors que pour la 2eme occurence, on a un espace avant et après.
    Alors seule la 1ère occurence de "mot" est surlignée
    => pas OK

    texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le ,mot à chercher est un ,mot de 5 lettres
    "mot" apparait 2 fois.
    Dans les 2 cas, il apparait de la meme façon (une virgule avant et un espace après)
    Alors les 2 occurences de "mot" sont surlignées
    => OK

    Dans les 4 exemples, si je teste avec le while, toutes les occurences sont surlignées dans tous les cas, sauf que les balises #titre# et ##titre## encadrant le mot, apparaissent autant de fois qu'il y a d'occurences du mot. Donc je ne peux pas utiliser le while car il me faut une seule fois les balises #titre# et ##titre## pour chaque occurence.

    Un même mot dans le texte apparait de plusieurs façons (avec un espace avant et après, avec une virgule avant et un espace après, avec un espace avant et une virgule après, avec un espace avant et une parenthèse après....). Or il faut que dans tous ces cas, je puisse surligner ce mot et l'encadrer par #titre# et ##titre## à chaque apparition dans le texte.

    Donc auriez-vous une idée de comment modifier le code pour résoudre ce problème?
    Merci.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Oui c'est tout à fait normal ce que tu obtient.

    En fait avec le "if" tu ne tient compte que de la première occurance trouvée et comme ton expression régulière est "\W s \W" et que tu récupères tout, il va tenir compte des deux caractère encadrant lors du remplacement.

    Pour régler ton problème il faut que tu ne récupères que le mot entre les deux caractères non-mot. Pour cela met le entre parenthèse ( "\W(s)\W" ) et fait un match.group(1) (enfin je crois que c 1, je ne suis plus sur).

    Après ça normalement ca devrait marché. Mais ils ne surlignera plus les caractère encadrant.

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    slt,
    le match.group(1) permet bien de récupérer uniquement ce que je veux et toutes les occurences sont surlignées quelques soient les caractères avant et après.

    Mais c'est justement ça le problème maintenant. Car si le mot que je dois trouver est inclus dans un autre, alors il sera aussi surligné. Exemple: le mot à trouver est "ct" et le mot dans le texte est "action": alors les lettres "ct" du mot "action" seront surlignées. Or il ne faut pas. C'est pour ça qu'en fait j'avais mis les caractères \W avant et après. Mais là, si je mets le match.group(1), ils ne servent plus à rien.

    Pour résumer, il faudrait trouver un moyen pour surligner toutes les occurences des mots de la liste mais pas si ils sont inclus dans d'autres mots et quelques soient les caractères (autres que des lettres) qui les encadrent.


    Merci de votre aide

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Dans ce cas remet les caratères non mot dans ta deuxième expression régulière (celle du replaceAll) mais au sens large, pas forcément celui qui a été trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Iterator it = liste.iteration();
    while (it.hasNext()) {
       s = (String)it.next();
       Pattern regex = Pattern.compile("\\W("+s+")\\W");
       Matcher match = regex.matcher(contenu);
       boolean b =match.find();
       if (b==true){
          String matchFound = match.group(1);
          String matchFoundmodif = "(\\Q\\W"+matchFound+"\\W\\E)";
          contenu = contenu.replaceAll(matchFoundmodif , "<font style bgcolor=\"#33CCFF\"> #titre# "+matchFound+" ##titre## </font>");
       }
    }

  8. #8
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    j'ai testé mais dans ce cas rien n'est surligné car si je fais un println j'ai :
    matchFound:mot
    matchFoundmodif: (\Q\Wmot\W\E)
    Or ce matchFoundmodif n'apparait jamais dans le texte.

    J'ai donc essayé plusieurs combinaisons. Et en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String matchFound = match.group(1);
    String matchFoundmodif = "(\\W"+matchFound+"\\W)";
    alors j'obtiens
    matchFound:mot
    matchFoundmodif\Wmot\W)
    Ainsi tout est bien surligné, il n'y a que les caractères d'avant et d'après le mot qui sont supprimés et n'apparaissent plus dans le texte mais ce n'est pas très grave.

    J'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String matchFound = match.group(1);
    String matchFoundmodif = "(\\W\\Q"+matchFound+"\\E\\W)";
    alors j'obtiens
    matchFound:mot
    matchFoundmodif\W\Qmot\E\W)
    et j'obtiens pareil que juste au dessus. là, les \Q et \E ne servent plus à rien si mon mot est uniquement composé de lettres (et pas de caractères comme les parenthèses où ça entraine des problèmes avec le replaceAll)

    Voilà, je crois que je vais en rester à cette solution (la dernière, avec \Q et \E au cas où, pour pas avoir de mauvaises surprises plus tard...). Le texte sera donc un peu modifié (suppression de certaines virgules ou parenthèses...) mais ça doit pas trop poser de problème à la compréhension

    Un grand merci à toi Barbu0055 qui est toujours là pour m'aider.

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

Discussions similaires

  1. [Regexp]Expressions régulières et code HTML
    Par Rayool dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 22/09/2006, 10h01
  2. Réponses: 22
    Dernier message: 18/07/2006, 15h05
  3. Expressions régulières Java (matchs insuffisants)
    Par jemore dans le forum Langage
    Réponses: 4
    Dernier message: 21/06/2006, 19h55
  4. [RegExp]Expressions régulières
    Par Guybrush dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 03/04/2006, 10h13
  5. [RegExp]expression régulière
    Par illegalsene dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2005, 15h33

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