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 :

Retrouver des références de norme dans un texte


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Retrouver des références de norme dans un texte
    Bonjour,

    Je cherche à récupérer des références de normes dans un texte afin de les encadrer de balise HTML <a>, je tente de le faire avec une regex.

    Les normes sont de la forme "NF EN xxx", où xxx est le numéro de la norme.

    Voici mon code soumis à un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
    Pattern patternNormes = Pattern.compile(".*((NF EN \\d*)).*");
    Matcher matcherNormes = patternNormes.matcher(txt);
     
    if(matcherNormes.find()){
        matcherNormes.matches();
        for(int i=1;i<matcherNormes.groupCount();i++){
            System.out.println(matcherNormes.group(i));
            txt = txt.replaceAll(matcherNormes.group(i),"<a>"+matcherNormes.group(i)+"</a>");
        }
        System.out.println(txt);
    }
    A priori la regex que j'utilise n'est pas suffisante puisqu'elle s'arrête à la première occurrence (en partant de la fin) correspondante à mon motif. Car au final seule la seconde norme de l'exemple se retrouve encadrée par les balises HTML <a> (sortie de console) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NF EN 148 
    blablabla NF EN 127 blablabla <a>NF EN 148</a> blablabla
    Y aurait-il un pro des regex qui pourrait me filer un tuyaux pour récupérer les autres occurrences (NF EN 127 dans mon exemple) ?

    Par avance, merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    puisque tu utilises find(), les .* au début et à la fin sont inutiles (et c'est à cause d'eux que tu passes directement à la dernières référence). Et l'appel à matches() va tout casser, il annule les infos stockées par find(). Il faut l'enlever, il ne servait à rien de toute façon.

    Bien sûr si tu as plusieurs références à trouver, il ne faut pas faire un if sur find(), mais bien entendu une boucle qui trouvera toutes les références au lieu d'une.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    En effet cela simplifie le code, par contre je dois conserver le find(), car dans le cas où le texte n'a pas de référence il me faut éviter une "java.lang.IllegalStateException: No match found".

    Voici mon code modifié ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
    Pattern patternNormes = Pattern.compile("(NF EN \\d*)");
    Matcher matcherNormes = patternNormes.matcher(txt);
     
    if(matcherNormes.find()){
        for(int i=0 ; i<matcherNormes.groupCount() ; i++){
            System.out.println(matcherNormes.group(i));
            txt = txt.replaceAll(matcherNormes.group(i),"<a>"+matcherNormes.group(i)+"</a>");
        }
        System.out.println(txt);
    }
    Cela dit, je ne récupère que la première occurrence, car voici la sortie console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NF EN 127
    blablabla <a>NF EN 127</a> blablabla NF EN 148 blablabla
    On y est presque, une petite idée pour récupérer la suivante ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Comme te l'a dit @Thelvin, il te faut faire une boucle : find() va trouver une occurence qui matche, et il faut refaire un autre find() pour trouver la suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
    		Pattern patternNormes = Pattern.compile("(NF EN \\d*)");
    		Matcher matcherNormes = patternNormes.matcher(txt);
     
    		while(matcherNormes.find()){
    		    for(int i=0 ; i<matcherNormes.groupCount() ; i++){
    		        System.out.println(matcherNormes.group(i));
    		        txt = txt.replaceAll(matcherNormes.group(i),"<a>"+matcherNormes.group(i)+"</a>");
    		    } 
    		}
     
    		System.out.println(txt);
    Ta boucle sur les groupes est inutile, puisqu'il n'y a qu'un groupe dans l'expression régulière. Et celui-ci ne sert à rien ici. Ceci fait le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
    Pattern patternNormes = Pattern.compile("NF EN \\d*");
    Matcher matcherNormes = patternNormes.matcher(txt);
     
    while(matcherNormes.find()){
        System.out.println(matcherNormes.group());
        txt = txt.replaceAll(matcherNormes.group(),"<a>"+matcherNormes.group()+"</a>");
    }
     
    System.out.println(txt);
    Tu pourrais procéder plus efficacement comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
    Pattern patternNormes = Pattern.compile("NF EN \\d*");
    Matcher matcherNormes = patternNormes.matcher(txt);
     
    StringBuffer sb=new StringBuffer();
    while(matcherNormes.find()){
        matcherNormes.appendReplacement(sb, "<a>"+matcherNormes.group()+"</a>");
    }
    matcherNormes.appendTail(sb);
    txt=sb.toString();
     
    System.out.println(txt);
    Voire plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
    Pattern patternNormes = Pattern.compile("NF EN \\d*");
    Matcher matcherNormes = patternNormes.matcher(txt);
     
    txt = matcherNormes.replaceAll("<a>$0</a>");
     
    System.out.println(txt);
    Voire encore plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String txt = "blablabla NF EN 127 blablabla NF EN 148 blablabla";
     
    txt = txt.replaceAll("NF EN \\d*", "<a>$0</a>");
     
    System.out.println(txt);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup cela fonctionne parfaitement !

Discussions similaires

  1. Mettre des mots en surbrillance dans un texte
    Par Moloc'h dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 0
    Dernier message: 14/02/2011, 19h03
  2. [Batch] Trier des nombres ordre croissant dans fichier texte
    Par AZzjeioafh dans le forum Scripts/Batch
    Réponses: 20
    Dernier message: 01/11/2009, 10h22
  3. [XL-2003] Retrouver les références de cellules dans les textbox de mon USF
    Par patrick60 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/07/2009, 11h51
  4. [batch] supprimer extension des noms de fichiers dans un texte
    Par mirage59 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 06/03/2009, 13h47
  5. Réponses: 2
    Dernier message: 16/05/2008, 14h43

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