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 :

Problème d'expressions régulières


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Problème d'expressions régulières
    Bonjour à tous et à toutes.
    Débutant en Java, j’utilise un système d’expressions régulières, bricolé à partir d’un exemple trouvé sur ce forum… Ben, à peu près tout le temps et à toutes sortes de fins. Voici en quoi ça consiste :
    monstringrésultat=monstringbase.replaceAll("^(.*?) *signeB.*", "$1").replaceAll("^.*(.*?) *signeA","$1") En clair « On coupe tout ce qui se trouve après le signe B, y compris le signe B, et tout ce qui se trouve avant Le signe A, y compris le signe A, et on sort la chaîne de caractères qui se trouve entre ces deux signes (un titre, une adresse de page internet, une note etc ».
    En général ça marche nickel, et en cas de pépin j’ai toujours trouvé jusqu’à présent une issue, plus ou moins élégante, pour m’en sortir, mais récemment je me suis trouvé face à deux cas de figure en forme de casse-tête et franchement je suis dans l’impasse. Les voici :

    Cas 1 : Je parse des flux rss avec l’api Rome. Pour chaque flux ou groupe de flux agrégés les titres sont disposés dans une jlist(51 jlist en fait puisqu’il s’agit de suivre un grand nombre de flux) accessible à l’utilisateur ; et les descriptifs et les liens correspondants dans une JtextArea inaccessible (ce pourraît être un stringbuffer mais c’était plus commode ainsi).
    Les descriptifs et les liens sont disposés bien sûr dans le même ordre que les titres auxquels ils correspondent et ils sont précédés chacun par !!plus leur numéro dans l’ordre.
    En clair le premier bloc descriptif/lien sur la jtextarea, correspondant au premier titre de la jlist est précédé de !!1 et suivi de !!2 qui précède le second bloc descriptif/lien et ainsi de suite.
    A l’intérieur de ces blocs le lien est en outre entouré de deux signes arbitraires (« voir la page » et « gagaprout » (ouais bon…) destinés à l’isoler ultérieurement.
    L’idée est donc de permettre à l’utilisateur de voir les titres des flux rss inscrits chacun sur les lignes d’une jlist et, en cliquant sur tel ou tel titre, de faire apparaître le descriptif correspondant sur une fenêtre de visualisation, puis en cliquant sur cette fenêtre, d’accéder à la page grâce au lien(et à java desktop).
    Voici le code qui me sert à faire ça :

    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
    // si on clique sur la jlist jl1
    if(e.getSource()==jl1){
    //on récupère le numéro de la ligne sur laquelle l’utilisateur à cliqué, + 1 puisque la jlist est graduée de 0 à x de telle sorte que le titre inscrit sur la première ligne serait désigné comme le titre 0 alors que nous voulons le designer comme le titre 1.
    int indexa1 = jl1.getSelectedIndex()+1;
    int indexb1 = indexa1+1;	
    String saisua1;
    String saisub1;
    // on récupère dans un String le bloc descriptif/lien correspondant au titre que l’on à cliqué sur la jlist. Par exemple si on a cliqué sur la septième ligne, on extrait la chaine de caractère qui se trouve entre !!7 et !!8. On a pris soin de supprimer tous les éventuels sauts de lignes parce que ça bloque l’opération et on en profite pour supprimer ou remplacer tous les signes surnuméraires et ceux qui résultent d’une mécompréhension par Rome de certains caractères tels que ‘, etc et bien sûr le point d’interrogation. 
    saisua1 = (jta1.getText().replaceAll("\\?", "").replaceAll("\n", "").replaceAll("^(.*?) *!!"+indexb1+".*", "$1").replaceAll("^.*(.*?) *!!"+indexa1+"","$1").replaceAll("\\<[^>]*>","").replaceAll("&#8217","'").replaceAll("…","..."));
    // A partir de ce premier string, comportant le descriptif et le lien, ce dernier entouré de « Voir la page » et « gagaprout », on isole d’abord le descriptif en coupant tout ce qui se trouve après le signe «Voir la page» mais en conservant celui-ci.
    saisub1 = saisua1.replaceAll("^(.*?Voir la page).*", "$1");
    // on affiche ce descriptif, suivi de la mention «Voir la page» dans la fenêtre de visualisation(JEditorPane).
    vue.setText(saisub1);
    // On isole le lien dans un String qui sera ensuite utilisé pour renseigner l’adresse de la page vers laquelle java desktop devra établir une connexion lors d’un clic sur la fenêtre de visualisation 
    saisuc = saisua1.replaceAll("^(.*?) *gagaprout.*", "$1").replaceAll("^.*(.*?) *Voir la page", "$1") ;
    }
    Bref tout cela marchait très bien, l’élégance mise à part. Jusqu’à ce je parse un flux qui comporte le descriptif suivant :
    Le Centre interuniversitaire d’études québécoises offre deux bourses d’excellence aux nouveaux doctorants en études québécoises. Ces bourses, d’une valeur de 
15 000$ chacune, ont pour objectif d’encourager la recherche dans les champs d’expertise du CIEQ et de soutenir les étudiants qui s’inscrivent à l’automne 2014 à l’UQTR au programme de doctorat en études québécoises (http://eq.cieq.ca). Elles s’adressent aux nouveaux étudiants qui s’engagent à soumettre à l’automne 2014 une demande de bourses auprès des organismes subventionnaires (CRSH-FRQSC).

    Le site émetteur du flux est http://calenda.org/ flux « bourses, prix, emplois ».
    Je me suis aperçu que le problème venait spécifiquement de l’expression 15 000$. Pour une raison que j’ignore Rome, lors du parsing, me la modifie en la faisant précéder d’un point d’interrogation, ce qui donne ?15 000$. Point d’interrogation que je ne peux pas retirer (a priori les ? devraient du reste déjà être supprimés par jta1.getText().replaceAll("\\?", "") qui débute ma formule et j’ai essayé de refaire .replaceAll("\\?", "") à différents endroits de mon code, ce qui n’a aucun effet, le point d’interrogation reste, j’ignore pourquoi, alors que ça marche pour tous les points d’interrogation « normaux ») et qui, c’est le problème, intèrfère avec mon expression régulière. Conclusion, si je sélectionne, par exemple, le titre 3(actuellement l’annonce problématique se trouve au 26eme rang) mon expression me coupe tout ce qui se trouve avant !!3 et m’affiche tout ce qui se trouve après, jusqu’à la fin. A contrario si je clique sur le titre 28 elle me coupe tout ce qui se trouve après !!29 et m’affiche tout ce qui se trouve avant, jusqu’au début. Bref, je coince.

    Voici pour le premier cas. Désolé d’avoir été si long mais ce n’est pas spécialement simple à expliquer. Le second cas l’est bien plus.

    Cas2 : Je lance des programmes et des pages internet avec java desktop. Les adresses de ces pages et les chemins absolus de ces programmes sont stockés sur un long string que vient « tronçonner » ma formule. Pour les adresses aucun souci par contre les programmes… Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(desktop.isSupported(Desktop.Action.OPEN))
    	  	try{
    	  	        desktop.open(new File(""+pta.getText().replaceAll("^(.*?) *Chprog"+idadb+".*", "$1").replaceAll("^.*(.*?) *Chprog"+idad+"", "$1")+""));
    	  	     }catch(Exception x){
    	  	    	x.printStackTrace();
    	  	     }
    Ou Chprog est le signe qui identifie les chemins absolus stockés dans mon string et idad une variable int qui se modifie au double clic sur une des 51 jlist de mon appli, de telle sorte qu’en double cliquant sur jl18, idad = 18 idadb = 19 et on est censé lancer le programme dont le chemin absolu est indiqué entre Chprog18 et Chrpog19. Problème classique, je suis sous windows et mes chemins absolus sont indiqués comme ça : "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe" avec des \ qui en java servent de caractère d’échappement. Donc si j’essaye d’indiquer une telle adresse à java desktop, il fait tilt. A tout problème sa solution Avant d’enregistrer mes chemins absolus dans mon long string je les adaptent avec : .replaceAll("\\\\","/" ); "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe" devient donc "C:/Program Files (x86)/Mozilla Thunderbird/thunderbird.exe" j’ai vérifié il est bien enregistré comme tel dans pta, et je sais que sous cette forme desktop le lance. Si je fais desktop.open(new File(""+"C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe")); ça lance thunderbird. Sauf que là pas j’ai une exception qui me dit que "C:/Program Files (x86)/Mozilla Thunderbird/thunderbird.exe" n’existe pas. Idem pour tous les autres programmes. Et je recoince.
    Voilà
    Merci de toute solution qui vous viendrait à l’esprit.

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    1) Le point d'interrogation n'en est pas forcément un... c'est peut-être un caractère non affichable, mal encodé, etc. qui s'affiche avec un '?' dans un JTextArea parce que le JTextArea ne sait pas faire mieux... Donc, fait gaffe à l'encoding, et regarde plutôt le contenu reçu par tes flux rss (év. en binaire) que ce qui s'affiche dans un composant graphique.

    2) Hum... je lance un truc au hasard, mais est-ce que tu lances ton appli en tant qu'administrateur windoz? c'est le genre de folder qu'on ne peut pas vraiment manipuler comme on veut...
    sinon, si tu hard code le chemin, ça se lance?
    sinon, pour lancer un process externe (appli, etc), il faut regarder du côté de Runtime.getRuntime().exec, qui est la méthode standard d'exécution (Desktop sers surtout pour ouvrir des fichiers de données avec l'appli par défaut de la plateforme)
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    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
    Voilà ce que je trouve quand je récupère le flux en l'affichant de manière un peu brutale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <description>Le Centre interuniversitaire dâétudes québécoises offre deux bourses dâexcellence aux nouveaux doctorants en études québécoises. Ces bourses, dâune valeur de <U+2028>15 000$ chacune, ont pour objectif dâencourager la recherche dans les champs dâexpertise du CIEQ et de soutenir les étudiants qui sâinscrivent Ã* lâautomne 2014 Ã* lâUQTR au programme de doctorat en études québécoises (http://eq.cieq.ca). Elles sâadressent aux nouveaux étudiants qui sâengagent Ã* soumettre Ã* lâautomne 2014 une demande de bourses auprès des organismes subventionnaires (CRSH-FRQSC). </description>
    U+2028 c'est le line separator en unicode. A différentier du CR et du LF. C'est un truc spécifique qu'on utilise en unicode et qui représente un séparateur de ligne mais qui n'est pas un séparateur de paragraphe.

    Qu'est-ce qu'il fout là? Mystère et boule de gomme, mais tu ne devrais pas avoir besoin de le traiter d'une manière difficile. Il fait partie du groupe \p{javaWhitespace}

    Au fait, ton code est un melting pot de regexp, impossible en le lisant d'avoir la moindre idée de ce qu'il fait. Il faudrait peut être envisager d'utiliser autre chose que la magie des regexp pour traiter ton cas

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Mystère résolu. Merci tchize_ pour avoir trouvé de quoi il s'agissait, parce qu'à vue de nez j'aurais pu tourner encore un siècle sans comprendre. Et merci Pill_s pour avoir vu la piste de la solution. Ca veut dire aussi que je n'ai pas forcément à me soucier de modifier mon code si le gag vient de "mystère et boule de gomme" et a peu de chance de se reproduire (je vais quand même me pencher sur ce groupe \p{javaWhitespace}). D'autant qu'il s'agit surtout pour moi de me faire la main avec cette appli qui n'a pas vocation à sortir de mon ordi avant un avenir lointain et très hypothètique. Ceci expliquant aussi le style disons, particulier, de mon code, que tu qualifies de melting pot en des termes biens courtois je trouve. Moi qui en ait une vue d'ensemble j'aurais plutôt dit "foire à la saucisse". De fait je ne suis pas sûr que ma formule "Si ta méthodo est bancale trouve une ficelle une vieille buche, et fait lui une jambe de bois, puis fait la marcher tant qu'elle tiens debout" qui a quelque légitimité dans mon domaine de spécialité, ait un grand avenir dans celui de la programmation. Mais il faut bien partir de là où on est. Dans le même registre je pense que je vais tout simplement bazarder la fonctionnalité d'appel des programmes, ce qui règlera de fait mon second problème, tout en m'évitant de me demander en quel mode je lance mes programmes windows.

    Bien je note la discussion comme résolue.

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

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