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

avec Java Discussion :

Utilisation de Matcher et Pattern, probleme de Regexp


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 45
    Points : 36
    Points
    36
    Par défaut Utilisation de Matcher et Pattern, probleme de Regexp
    ...

    >Message édité plusieurs fois, voir le edit 3 pour la question actuelle<

    ...

    Bonjour,

    Je dois parser des lignes de la forme
    mot(mot)
    ou
    mot(mot,mot,mot)

    Avec entre les parenthèse un nombre non finis de mots séparés par des virgules. Quelques espaces pouvant apparaitre.
    Je souhaite récupérer tous les "mot"

    J'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Pattern p = Pattern.compile("(\\w+) *\\(((\\w+) *,? *)+\\)");
    Matcher m = p.matcher(maLigne);
    Logiquement si je passe une ligne comme mot1(mot2,mot3,mot4)
    Et une boucle de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while( m.find() ) {
        System.out.println(m.group());
    }
    Devrais m'afficher les mots les uns a la suite des autres.

    Soit ma regexp est fausse, soit je me trompe dans l'utilisation du matcher...
    Merci de m'éclairer. :jap:

    edit : changement de la regexp par "(\\w+) *\\(((\\w+) *,? *)+\\)", celle-ci match toutes mes lignes donc elle doit être bonne.

    edit 2 : J'ai trouvé, je cherchais a matcher ma chaine pour en extraire des groupes, mais en fait il faut matcher les groupes que l'on souhaite.
    Mon bon code (tout con quand j'y pense) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Pattern p = Pattern.compile("(\\w+)");
    Matcher m = p.matcher(maLigne);
    while( m.find() ) {
        System.out.println(m.group());
    }
    Avec la ligne mot1(mot2,mot3,mot4) résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mot1
    mot2
    mot3
    mot4
    edit 3 : Finalement j'ai toujours un problème avec d'autres chaines
    Je souhaite parser une chaine comme (mot\\((mot,)+\\),)+
    Et je souhaite recuperer juste ce qui est entre les parenthèses en gras, et il peux y en avoir plusieurs, car vous aurez remarquez le + à la fin.
    Et je ne peux pas faire de split sur la virgule.

    Merci

  2. #2
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    "\((\w+\(.*?\),)\)" ?

  3. #3
    Membre habitué Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Points : 131
    Points
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    String s = "(mot1(mot2,mot3,mot4)) (mot5(mot6)) (mot1(mot8,mot9))";
    Pattern pattern = Pattern.compile("\\(\\w+\\s*\\(\\w+(,\\s*\\w+)*\\)\\)");
    Matcher matcher = pattern.matcher(s);
    while(matcher.find()) {
    	System.out.println(matcher.group());
    }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (mot1(mot2,mot3,mot4))
    (mot5(mot6))
    (mot1(mot8,mot9))
    Si j'ai bien compris ce que tu voulais !
    Remarque: J'ai ajouté quelques blancs optionnels mais il faudrait en prévoir à d'autres endroits ou tous les supprimer au départ...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 45
    Points : 36
    Points
    36
    Par défaut
    Merci pour vos réponses

    Je répond en retard, je m'étais débrouillé avec les parenthèses fermantes et un split.

    Pour reprendre ton exemple jean.2edi
    En fait mon "s" est comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s="mot1(mot2,mot3,mot4),mot5(mot6),mot1(mot8,mot9)."
    Avec des virgules entre les mots et un point a la fin.

    J'utilise le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    maTableDeString=s.split(" *\\( *| *\\) *[,|.] *");
    for(int i=0;i<predicatsMSTable.length;i+=2){
    	debut=maTableDeString[i];
    	detailsEntreParenthese=maTableDeString[i+1].split(" *, *");
    	// ... mes traitements
    }
    Je pourrais certainement adapter ça avec ta solution, je ne sais pas ce qui est le plus efficace cependant.
    J'imagine que split utilise Matcher et Pattern et remplis un tableau avec tous les matchs et dans ce cas ma solution est plus "lente" mais dans quelles proportions...

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. utilisation des motifs et pattern (matcher)
    Par sabrinabest dans le forum Langage
    Réponses: 2
    Dernier message: 21/09/2007, 18h10
  3. [GRASP] Est-ce que j'utilise correctement les design pattern?
    Par Tourix dans le forum Design Patterns
    Réponses: 7
    Dernier message: 21/06/2006, 18h27
  4. [RegExp] problème de regexp
    Par carlos20 dans le forum Langage
    Réponses: 13
    Dernier message: 06/12/2005, 13h52
  5. Probleme de RegeXp
    Par vodevil dans le forum Langage
    Réponses: 6
    Dernier message: 29/11/2005, 19h33

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