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 :

problème d'expression régulière en java


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut problème d'expression régulière en java
    Bonjour,

    Je ne suis pas du tout à l'aise avec java, plutôt avec PHP. Je constate que les réactions avec une règle d'expression régulière ne sont pas les mêmes sous PHP qu'en java. J'ai donc un soucis pour créer une règle d'extraction d'une portion de texte.

    J'ai un code HTML duquel je souhaite extraire uniquement une partie. Pour exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $code = 'du texte et ou du code html avant <div class="rte"><p>mon texte qui peut contenir des balises html ou pas, comme c'est le cas ici puisqu'il est encadré par des balise p</p></div> </section> <div>encore du texte blabla</div>';
    Je voudrai récupérer tout ce qui se trouve à l'intérieur de la balise div. Pour ce faire, en php je fais comme ça et ça fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $regexp = '/<div class="rte">(.+)<\/div> <\/section>/';
    en java j'ai fais la même chose et ça foire complet. Je me retrouve en java avec une extraction de tout ce qui se trouve après "<div class="rte">" sans que ça s'arrête avant "<\/div> <\/section>" Je n'y comprends rien...

    Une idée pour me sortir de cette merdouille ?

    Merci d'avance

  2. #2
    Membre confirmé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Points : 490
    Points
    490
    Par défaut
    Bonjour,

    en java pur tu peux faire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String str = "du texte et ou du code html avant <div class="rte"><p>mon texte qui peut contenir des balises html ou pas, comme c'est le cas ici puisqu'il est encadré par des balise p</p></div> </section> <div>encore du texte blabla</div>";    
    String result = str.substring(str.indexOf("<div class="rte">") + 1, str.indexOf("</div>"));
    N'oubliez pas la balise

    est ton ami mais quand Google ne trouve pas quelque choses, il demande à Chuck Norris.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Merci diablo_22 pour ta réponse.

    Je ne peux manifestement utiliser du java pure.

    J'explique, j'ai un module php qui lui même utilise groovy et donc java. C'est là dedans que je dois coder ma regex.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le code qu'on ta file fonctionne aussi avec groovy.

    Quand aux expressions regulieres, que ce soit java ou php, ce n'est pas adapte a du parsing xml. Utilise un parseur xml ou une XSLT pour filtrer du xml

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Alors, ce n'est pas du xml que je parse, mais du code source de page web.

    En variable dans mon module j'ai la variable code qui correspond au code source html récupéré lors du crawl. Exemple d'une portion de mon code qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    regextitre = /(?si)<h1 itemprop="name">([^<]+)<\/h1>/
    matchtitre = (code=~regextitre)
     
    if(matchtitre.find())
    {
    titre=matchtitre.group(1)
    display(titre)
    }
    Pour tenter d'adapter le code donné plus haut j'ai fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String result = code.substring(code.indexOf("<div class="rte">") + 1, code.indexOf("</div>"));
    J'ai donc changé str.substring pour code.substring vu que mes données sont dans code, j'ai peut être fait une connerie là dessus ? Mais j'ai cette erreur :

    startup failed:
    Script1.groovy: 23: unexpected token: rte @ line 23, column 58.
    ing(code.indexOf("<div class="rte">") +
    ^

    1 error

    org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
    Script1.groovy: 23: unexpected token: rte @ line 23, column 58.
    ing(code.indexOf("<div class="rte">") +
    ^

    1 error

    org.codehaus.groovy.control.ErrorCollector.failIfErrors #309 @ErrorCollector.java
    org.codehaus.groovy.control.ErrorCollector.addFatalError #149 @ErrorCollector.java
    org.codehaus.groovy.control.ErrorCollector.addError #119 @ErrorCollector.java
    org.codehaus.groovy.control.ErrorCollector.addError #131 @ErrorCollector.java
    org.codehaus.groovy.control.SourceUnit.addError #359 @SourceUnit.java
    org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST #142 @AntlrParserPlugin.java
    org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST #108 @AntlrParserPlugin.java
    org.codehaus.groovy.control.SourceUnit.parse #236 @SourceUnit.java
    org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits #928 @CompilationUnit.java
    org.codehaus.groovy.control.CompilationUnit.doPhaseOperation #590 @CompilationUnit.java
    org.codehaus.groovy.control.CompilationUnit.processPhaseOperations #566 @CompilationUnit.java
    org.codehaus.groovy.control.CompilationUnit.compile #543 @CompilationUnit.java
    groovy.lang.GroovyClassLoader.doParseClass #297 @GroovyClassLoader.java
    groovy.lang.GroovyClassLoader.parseClass #267 @GroovyClassLoader.java
    groovy.lang.GroovyShell.parseClass #692 @GroovyShell.java
    groovy.lang.GroovyShell.parse #704 @GroovyShell.java
    groovy.lang.GroovyShell.parse #740 @GroovyShell.java
    groovy.lang.GroovyShell.parse #731 @GroovyShell.java
    netsur2.SimpleCrawler.scriptGroovy #522 @SimpleCrawler.java
    netsur2.SimpleCrawler.saveContent #425 @SimpleCrawler.java
    netsur2.SimpleCrawler.crawl #172 @SimpleCrawler.java
    netsur2.Script.run #569 @MegaImporter.java
    La ligne en erreur est justement celle de la nouvelle instruction rajouté, pour rappel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String result = code.substring(code.indexOf("<div class="rte">") + 1, code.indexOf("</div>"));
    Accessoirement, je me demande à quoi bon mettre une balise de départ et une de fin dans la regex si finalement java ne s'arrête pas quand il la trouve, PHP ne va pas plus loin que la balise de fin ce qui me semble logique. Le fonctionnement sous java des regex me semble étrange

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par johnny-57 Voir le message

    Accessoirement, je me demande à quoi bon mettre une balise de départ et une de fin dans la regex si finalement java ne s'arrête pas quand il la trouve,
    Un regexp, c'est quelque chose que tu match sur un ensemble de caractère. L'ensemble matche ou ne matche pas. Si la balise est dans la regexp, alors elle fait partie de l'ensemble qui doit matcher. C'est vrai en java, c'est aussi vrai en php. Comme t'as pas mis ton code java, dur dur de le corriger.
    Voilà un code d'exemple qui montre accessoirement pourquoi les regexp ne sont pas adapter pour nettoyer du html / xml / autre langage de balisage

    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
    import java.util.regex.*;
    public class HelloWorld{
     
         public static void main(String []args){
             String str = "du texte et ou du code html avant <div class=\"rte\"><p>mon texte qui peut contenir des balises html ou pas, comme c'est le cas ici puisqu'il est encadre par des balises p</p></div> </section> <div>encore du texte blabla</div>";
             String str2 = "du texte et ou du code html avant <div class=\"rte\"><p>mon texte qui ne peut contenir n'importe quelle balise html, la preuve <section><div>avec <section><div> <section><div class=\"rte\">ce caca</div> </section> </div> </section> </div> </section> <div>encore du texte blabla</div>";
             String regexp = ".*<div class=\"rte\">(.+)</div> </section>.*";
             Pattern p = Pattern.compile(regexp);
             Matcher m = p.matcher(str);
             if (m.matches()){
                 System.out.println("Trouve 1: "+m.group(1));
             }
             m = p.matcher(str2);
             if (m.matches()){
                 System.out.println("Trouve 2: "+m.group(1));
             }
         }
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Ben là c'est pire que de simplement inclure les balises de départ et de fin. Il me trouve bien le texte après la balise de départ, mais, et ça là où je trouve ça illogique, il prends tout ce qui est ensuite jusqu'à la fin du code source de la page.

    En php ça capture que ce que je demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $code = 'du texte et ou du code html avant <div class="rte"><p>mon texte qui peut contenir des balises html ou pas, comme c\'est le cas ici puisqu\'il est encadré par des balise p</p></div> </section> <div>encore du texte blabla</div>';
     
    $regexp = '/<div class="rte">(.+)<\/div> <\/section>/';
    if (preg_match_all($regexp, $code, $sortie))
    {
     
    print_r ($sortie);
    }
    Ce code me donne :

    Array
    (
    [0] => Array
    (
    [0] => <div class="rte"><p>mon texte qui peut contenir des balises html ou pas, comme c'est le cas ici puisqu'il est encadré par des balise p</p></div> </section>
    )

    [1] => Array
    (
    [0] => <p>mon texte qui peut contenir des balises html ou pas, comme c'est le cas ici puisqu'il est encadré par des balise p</p>
    )
    php se contente donc dans le tableau 0 de prendre tout y compris balise d'ouverture et de fermeture, et en aucun cas plus loin que celle de fermeture, et en tableau 1 uniquement la capture demandé.

    Pour info, j'utilise un script qui se charge du crawl, script que j'ai acheté, du coup je n'ai donné dans mon précédent message que la partie du code que je personnalise.

    Edit :

    J'ai trouvé pourquoi la fonction qui m'avait été donné plante, à cause des guillemet : String result = code.substring(code.indexOf("<div class="rte">") + 1, code.indexOf("</div>")); Elles n'étaient pas echapés.

    J'ai modifié donc la ligne, mais j'arrive du coup sur une autre erreur :

    String index out of range: -50216
    java.lang.StringIndexOutOfBoundsException: String index out of range: -50216
    java.lang.String.substring #-1 @null
    Script1.run #23 @Script1.groovy
    N'y a t-til pas moyen que ça ce comporte comme en PHP ? tableau 0 tout y compris balise d'ouverture/fermeture, tableau 1 uniquement ce qui a été demandé à être capturé ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la regexp que je t'ai donné capture aussi ce qui se trouve avant la balise (cf les .* devant / derrière) puisque je pensait que tout ce qui t'intéressait c'était le groupe 1 (la parenthèse). Si tu veux juste la partie qui matche la regexp comme groupe 0, retire les .* de début et fin de la regexp, et remplace les appels à matches() par des appels à find()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.util.regex.*;
    public class HelloWorld{
     
         public static void main(String []args){
             String str = "du texte et ou du code html avant <div class=\"rte\"><p>mon texte qui peut contenir des balises html ou pas, comme c'est le cas ici puisqu'il est encadre par des balises p</p></div> </section> <div>encore du texte blabla</div>";
             String regexp = "<div class=\"rte\">(.+)</div> </section>";
             Pattern p = Pattern.compile(regexp);
             Matcher m = p.matcher(str);
             if (m.find()){
                 System.out.println("Trouve  "+m.group(1)+ " dans "+m.group(0));
             }
     
         }
    }

Discussions similaires

  1. petit problème d'expression régulière
    Par stoyak dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2006, 11h20
  2. [regexp] petit problème d'expression régulière
    Par LE NEINDRE dans le forum Langage
    Réponses: 14
    Dernier message: 16/12/2005, 10h33
  3. Problème d'expression régulière
    Par SiM07 dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 17h57
  4. Problème d'expression régulière
    Par Pymm dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 11/10/2005, 15h04
  5. Problème d'expression régulière
    Par Neitsa dans le forum Général Python
    Réponses: 3
    Dernier message: 11/08/2005, 14h29

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