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 :

[String] Pattern & Matcher


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut [String] Pattern & Matcher
    Y a-t-il une méthode plus rapide que l'exploitation des classes Pattern et Matcher du package java.util.regex, pour la recherche de chaines génériques en Java ?

  2. #2
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut Précisions
    Je précise un peu ma demande :

    J’ai la boucle suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    res = ligne;
    // Parcours de l'ensemble des patterns à remplacer
    for(Iterator i = listeDeRemplacement.iterator() ; i.hasNext() ; ) {
    	elt = (ElementDeRemplacement)i.next();
     
    	pattern = Pattern.compile(elt.chaineARemplacer);
    	matcher = pattern.matcher(res);
    	if(matcher.find()) {
    		res = matcher.replaceAll(elt.chaineDeRemplacement);
    	}			
    }
    qui est elle-même appelée dans une boucle sur l’ensemble des lignes d’un fichier (pouvant aller jusqu’à 2Go).

    Afin de gagner un peu de temps, j’ai directement stocké l’objet pattern dans la collection parcourue. J’obtiens donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    res = ligne;
    for(Iterator i = listeDeRemplacement.iterator() ; i.hasNext() ; ) {
    	elt = (ElementDeRemplacement)i.next();
     
    	matcher = elt.patternARemplacer.matcher(res);
    	if(matcher.find()) {
    		res = matcher.replaceAll(elt.chaineDeRemplacement);
    	}			
    }
    Mais arrivé là, je dois admettre que je suis à cours d’idées, et le temps de traitement est encore colossal .

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pourquoi ne pas utiliser directement la méthode replaceAll() de String ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    res = ligne;
    // Parcours de l'ensemble des patterns à remplacer
    for(Iterator i = listeDeRemplacement.iterator() ; i.hasNext() ; ) {
    	elt = (ElementDeRemplacement)i.next();
    	res = res.replaceAll(elt.chaineARemplacer, elt.chaineDeRemplacement);
    }

    a++

  4. #4
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Parce qu’il me semblait que le replaceAll() de String correspondait à un appel de Pattern.compile(regex).matcher(str).replaceAll(repl).
    J’en ai donc déduis que le faire moi-même pourrait être plus rapide.

    Suite au doute levé, je viens de vérifier. Les perf d’exploitation du replaceAll() de String sont effectivement équivalente au fait de placer le Pattern.compile() dans la boucle.

    Dans mon cas, cela multiplie par 3 le temps de traitement.

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    En effet replaceAll() de String correspond bien à un appel de Pattern.compile(regex).matcher(str).replaceAll(repl)... donc cela ne change rien au contraire...


    Tu peux toutefois supprimer le matcher.find() qui est inutile car c'est géré par matcher.replaceAll(), cela peut améliorer les performances car le pattern est recherché une fois de trop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    res = ligne;
    // Parcours de l'ensemble des patterns à remplacer
    for(Iterator i = listeDeRemplacement.iterator() ; i.hasNext() ; ) {
       elt = (ElementDeRemplacement)i.next();
     
       pattern = Pattern.compile(elt.chaineARemplacer);
       matcher = pattern.matcher(res);
       res = matcher.replaceAll(elt.chaineDeRemplacement);    
    }

    Sinon par curiosité, à quoi ressemble les lignes et les patterns que tu recherches ???

    a++

  6. #6
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    Je dois admettre que cela simplifie l’écriture, mais je ne constate aucune amélioration des performances.

    Pour satisfaire ta curiosité, et au cas ou cela amènerait à quelqu’inspiration, voici un exemple de ligne traitée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CalculTotalFacture => IndentifiantClient (262) / DateFacturation (27/01/2004)
    Et les patterns que je recherche sont du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    elt.chaineARemplacer 					    elt.chaineDeRemplacement
    IndentifiantClient \(.{1,10}\) 			IndentifiantClient
    DateFacturation \(.*\) 					  DateFacturation
    Bref, je cherche à supprimer les identifiants du fichier.
    Sachant que pour chaque ligne de mon fichier, j’ai en moyenne 50 à 80 patterns à traiter.

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jproto
    Sachant que pour chaque ligne de mon fichier, j’ai en moyenne 50 à 80 patterns à traiter.
    Ah oui quand même
    Sur 2Go j'imagine que ca doit prendre pas mal de temps...

    Essaye de voir si tu ne peux pas regrouper les patterns...
    Par exemple dans ce cas, et si tu n'as rien d'autre entre parenthèses dans ton fichier, tu pourrais regrouper les deux patterns en 1 seul afin de supprimer toutes les parenthèses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    replaceAll("\(.*?\)", "");
    Sinon si tes patterns sont plus compliqué que ca (ce que je crains), il faudrait peut-être voir si ce ne serait pas mieux d'utiliser un analyseur syntaxique afin de mofidier la chaine en un seul passage (ou lieu d'un passage par Pattern). Tu peux trouver des outils pour cela dans la boite à outils Java (antlr, cup, JFlex et Javacc), mais par contre je ne les ai jamais utilisé...

    a++

  8. #8
    Membre éclairé

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Par défaut
    En fait, mes patterns sont un peu plus compliqués. Il doit m’être possible d’en regrouper quelques un (et je vais m’y atteler), mais toute la subtilité du traitement réside évidement (et malheureusement) dans le fait de conserver la majorité des identifiants du fichiers (valeurs placées entre parenthèses). D’ailleurs, les patterns ne sont pas écris en dur, mais fournis par un fichier de paramétrage.

    En revanche, je dois admettre ne pas avoir pensé à explorer du côté de la boite à outils. Voici une étude qui devrait m’occuper un petit moment.
    Merci beaucoup pour l’orientation.

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

Discussions similaires

  1. Problème de Pattern pour Matcher une expression précise
    Par Zaza91280 dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2012, 10h11
  2. Regexp Pattern et Matcher
    Par Space23 dans le forum Général Java
    Réponses: 3
    Dernier message: 23/09/2011, 00h08
  3. Expressions régulières en Java,Pattern et Matcher
    Par Malatok dans le forum Général Java
    Réponses: 8
    Dernier message: 08/09/2010, 15h08
  4. Java Pattern et matcher
    Par Bobble dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 31/05/2010, 15h00
  5. JDK1.3 Pattern et Matcher
    Par Shabata dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 13/03/2006, 11h29

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