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 lutilisateur à 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 lon à 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 lopération et on en profite pour supprimer ou remplacer tous les signes surnuméraires et ceux qui résultent dune mécompréhension par Rome de certains caractères tels que , etc et bien sûr le point dinterrogation. saisua1 = (jta1.getText().replaceAll("\\?", "").replaceAll("\n", "").replaceAll("^(.*?) *!!"+indexb1+".*", "$1").replaceAll("^.*(.*?) *!!"+indexa1+"","$1").replaceAll("\\<[^>]*>","").replaceAll("’","'").replaceAll(" ","...")); // A partir de ce premier string, comportant le descriptif et le lien, ce dernier entouré de « Voir la page » et « gagaprout », on isole dabord 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 ladresse de la page vers laquelle java desktop devra établir une connexion lors dun 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
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.
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(); }
Voilà
Merci de toute solution qui vous viendrait à l’esprit.
Partager