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 :

[expressions régulières] lenteur d'exécution


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 8
    Par défaut [expressions régulières] lenteur d'exécution
    Bonjour,

    j'ai un problème en utilisant les expressions régulières :

    je cherche dans un texte des morceaux de phrase à l'aide d'expressions régulières.

    Par exemple, je cherche des morceaux de phrases correspondant à l'expression régulière suivante :

    (([A-Z][A-Za-z]+[ -]*)+) est mort à l'âge de ([0-9][0-9][0-9]?) ans

    Voici un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		// creation de l'objet patron
    		patronCourant = "(([A-Z][A-Za-z]+[ -]*)+) est mort à l'âge de ([0-9][0-9][0-9]?) ans";
    		patron = Pattern.compile();
    		detecteur = patron.matcher(phrases[i]);
    		idMatch = 0;
    		while(detecteur.find(idMatch))
    		{
    			// on recupere la partie matchee
    			partieMatchee = detecteur.group();
    			matchs.add(partieMatchee);
    			idMatch = detecteur.start();
    		} // fin while
    Tout se passe très bien tant que le texte est en minuscule.
    En revanche, si je tombe sur une suive de caractères en majuscules, le programme s'éfondre complètement. Il se met à ramer et met très longtemps à rechercher la présence de l'expression régulière dans la chaîne de caractères, même si celle-ci en fait que 1000 caractères.
    En mode débug, il bloque sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(detecteur.find(idMatch))
    Il ne s'agit pas d'une boucle infinie, il mets juste 3 ans à tester la présence de l'expression régulière dans la phrase.

    Le but est de rechercher les occurrences de cette expression régulière dans des textes qui font plusieurs mégas : ce n'est donc pas envisageable, au niveau des temps de réponse, de continuer comme cela.
    Quelqu'un peut-il me dire pourquoi le programme est-il si long quand il tombe sur des phrases en majuscules ?
    Que puis-je faire pour résoudre ce problème ? (à notre que la casse est pour moi très importante : je ne peux donc aps passer tout le texte en minuscules)

    Merci d'avance pour votre attention et pour votre aide.


    Krusty.

  2. #2
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    Bonjour,

    Tu peux essayer de développer un parser pour tes chaines de caractères avec javacc.

    Je pense que les performances seraient meilleures car javacc te générera du code java spécifique à tes expressions régulières. Je dis ça mais j'ai jamais fait de tests de performances...

    Si tu pars sur cette solution je serais intéressé par connaître le gain ;-)

    Bonne chance.

  3. #3
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    Un autre idée (un peu bricolage) si ça marche bien avec du texte en minuscule :
    - tu fais un premier test en mettant le texte en minuscule,
    - si le texte en minuscule matche, alors tu refait le test en respectant la casse.
    Ainsi ça te permet d'éliminer (rapidement ?) tous les textes dont tu es sûr qu'ils ne matchent pas.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 124
    Par défaut
    J'ai pas tout compris ton code, tu pourrais mettre le début de ton code aussi, ça aiderait.
    Y'a une classe regex c'est ça que tu utilises?

  5. #5
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Essaye avec (([A-Z][A-Za-z]+[ -]*?)+?)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 8
    Par défaut
    Citation Envoyé par Gfx
    Essaye avec (([A-Z][A-Za-z]+[ -]*?)+?)
    Cela ne fonctionne pas mieux, en même temps, je ne suis pas sûr que les ? apprortent une défférence (sauf dans le cas du + qui revient à le remplacer par une *).

    Citation Envoyé par Xavinou
    - tu fais un premier test en mettant le texte en minuscule,
    - si le texte en minuscule matche, alors tu refait le test en respectant la casse.
    L'idée est pas mal mais j'ai besoin des majuscules pour délimiter entre autre le nom de la personne.
    Je vais quand même essayer de tester cette méthode en matchant seulement une partie de l'expression régulière (celle qui n'a pas de majuscules).

    Citation Envoyé par yizashi
    J'ai pas tout compris ton code, tu pourrais mettre le début de ton code aussi, ça aiderait.
    Y'a une classe regex c'est ça que tu utilises?
    Il n'y a pas grand chose de plus au début si ce n'est la déclaration des variables.
    patron est de type Pattern et detecteur de type Matcher.
    Je n'utilise pas la classe regex (qui donne après test les mêmes problèmes).

    Citation Envoyé par Xavinou
    Bonj
    Tu peux essayer de développer un parser pour tes chaines de caractères avec javacc.
    Je pense que les performances seraient meilleures car javacc te générera du code java spécifique à tes expressions régulières. Je dis ça mais j'ai jamais fait de tests de performances...
    Si tu pars sur cette solution je serais intéressé par connaître le gain ;-)
    Bonne chance.
    Je en connais pas javacc ... je suis en train de regarder si cela peut correspondre à ce que je fais (mais j'ai pas encore bien pigé comment ça marche et à quoi ça sert) ... mais je continue à regarder ça.

    Si quelqu'un à d'autres idées, je suis prenneur.

    Merci à tous pour vos réponses.



    Krusty.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 8
    Par défaut
    re bonjour

    j'ai d'autres infos sur le sujet.

    Il semblerait que le problème ne vienne pas des majuscules car j'ai tout passé en minuscule et j'ai quand même trouvé un plantage.

    En fait, le programme plante quand certaines expressions sont testés sur certaines phrases.

    Voici un exemple que vous pourrez exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class TestEreg 
    {
    	/**
             * @param args
             */
    	public static void main(String[] args) 
    	{
    		String patronCourant = "(de ?)?(([a-z][a-z]+[ -]*)+) à l'âge de ([0-9][0-9][0-9]?) ans \\(";
    		Pattern patron = Pattern.compile(patronCourant,	Pattern.CANON_EQ);
    		String snippets = "toto est le petit frere de tata DDDDDDDDEEEEEEEHHHHHOOOOOOORRRRRRRSSSSSSS titi et tutu sont sur un bateau qui est mort à l'âge de 50 ans\n";
    		snippets = snippets.toLowerCase();
    		Matcher detecteur = patron.matcher(snippets.replaceAll("\\s", " "));
     
    		while(detecteur.find()) // C EST LA QUE CA BLOQUE
    		{
    			// on recupere la partie matchee
    			System.out.println("partie matchée = " + detecteur.group());
    		} // fin while
    	} // fin main
     
    } // fin de la classe

Discussions similaires

  1. expression régulière + excution de commande shell
    Par goanes dans le forum Langage
    Réponses: 3
    Dernier message: 11/10/2006, 13h53
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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