un grand merci pr vos réponses. C'est donc à cause de cette put... de regex que ça rentre tjs ds la boucle car elle matche tout. Au moins je comprends pourquoi b valait tjs vrai.
Donc maintenant, si je peux me permettre de vous demander encore de m'aider, ce serait sympa. Je vous explique le pb en entier. Je préviens : ça va etre un peu long mais normalement c'est compréhensible (enfin, j'espère..)
J'ai un texte. Je le découpe phrase par phrase. Je recherche certains mots du texte qui sont encadrés par des balises ouvrantes #...# et fermantes ##...##. Les ... peuvent etre remplacés par 2 mots différents.
exemple de phrase:
Code :
- il était une fois #mot1# mot_a_recup ##mot1## et aussi #mot2# autre_mot_a_recup ##mot2## et il fait beau #mot2# encore_un_mot_a_recup ##mot2## mais ça ne va pas durer longtemps #mot1# dernier_mot_a_recup ##mot1##.
|
Jusque là, je devais récupérer uniquement les segments de phrases qui commençaient par #mot1# et se finissaient par ##mot2## ou bien qui commençaient par #mot2# et se finissaient par ##mot1##.
ça fonctionnait. Je faisais comme ceci:
Code :
- Pattern regex_1_2 = Pattern.compile("(#mot1#([^#]*?)##mot1##([^#]*?)#mot2#([^#]*?)##mot2##)" );
- Pattern regex_2_1 = Pattern.compile("(#mot2#([^#]*?)##mot2##([^#]*?)#mot1#([^#]*?)##mot1##)" );
- for (int i=0; i<phrase.length;i++){ //phrase est un tableau contenant chaque phrase du texte dans une case
- Matcher match_1_2 = regex_1_2.matcher(phrase[i]);
- while(match_1_2.find()){
- total_1_2 += "<font style=\"background-color:#33CCFF\">"+match_1_2.group(2)+"</font>"+match_1_2.group(3)+"<font style=\"background-color:#FFFF00\">"+match_1_2.group(4)+"</font>";
- }
-
- Matcher match_2_1 = regex_2_1.matcher(phrase[i]);
- while(match_2_1.find()){
- total_2_1 += "<font style=\"background-color:#FFFF00\">"+match_2_1.group(2)+"</font>"+match_2_1.group(3)+"<font style=\"background-color:#33CCFF\">"+match_2_1.group(4)+"</font>";
- }
- }
|
sauf que mon problème c'est que maintenant, je dois récupérer la phrase en entier. Quand dans la phrase il y a les balises, je récupère le mot entre ces balises, je l'encadre avec des vraies balises html et je le remets dans la phrase.
Au départ, j'avais fait comme le code juste après mais ça ne fonctionne pas vraiment car si dans une même phrase, j'ai plusieurs balises du meme type, je vais récupérer plusieurs fois la meme phrase mais pas avec les memes mots surlignés a chaque fois. Or moi, je veux les phrases en un seul exemplaire.
Code :
- //les regex st les memes que ds le code au dessus
- for (int i=0; i<phrase.length;i++){
-
- Matcher match_1_2 = regex_1_2.matcher(phrase[i]);
- while(match_1_2.find()){
-
- terme1 = match_1_2.group(2);
- Pattern regex_terme1 = Pattern.compile(terme1);
- Matcher match_terme1 = regex_terme1.matcher(phrase[i]);
- while (match_terme1.find())
- phrase12=phrase[i].replaceAll(terme1,"<font style=\"background-color:#33CCFF\">"+terme1+"</font>" );
-
- terme2 = match_1_2.group(4);
- Pattern regex_terme2 = Pattern.compile(terme2);
- Matcher match_terme2 = regex_terme2.matcher(phrase[i]);
- while (match_terme2.find())
- phrase12=phrase12.replaceAll(terme2,"<font style=\"background-color:#FFFF00\">"+terme2+"</font>" );
-
- total12 += phrase12;
- }
-
- Matcher match_2_1 = regex_2_1.matcher(phrase[i]);
- while(match_2_1.find()){
-
- terme2 = match_2_1.group(2);
- Pattern regex_terme2 = Pattern.compile(terme2);
- Matcher match_terme2 = regex_terme2.matcher(phrase[i]);
- if (match_terme2.find())
- phrase21=phrase[i].replaceAll(terme2,"<font style=\"background-color:#FFFF00\">"+terme2+"</font>" );
-
- terme1 = match_2_1.group(4);
- Pattern regex_terme1 = Pattern.compile(terme1);
- Matcher match_terme1 = regex_terme1.matcher(phrase[i]);
- if (match_terme1.find())
- phrase21=phrase21.replaceAll(terme1,"<font style=\"background-color:#33CCFF\">"+terme1+"</font>" );
-
- total21 += phrase21;
- }
- }
|
Je pense que si j'ai les phrases en double c'est car je fais les tests dans les 2 sens (soit mot1 puis mot2, soit mot2 puis mot1). Donc j'ai essayé de tout regrouper. Et c'est là que j'ai le problème du premier message.
Code :
- Pattern regex = Pattern.compile("((#mot1#([^#]*?)##mot1##([^#]*?)#mot2#([^#]*?)##mot2##)||(#mot2#([^#]*?)##mot2##([^#]*?)#mot1#([^#]*?)##mot1##))" );
- Matcher match = regex.matcher(phrase[i]); //texte découpé en phrases
- boolean b = match.find();
- while (b==true){ //la phrase ne contient pas le motif de la regex et pourtant b vaut true
- int nb = match.groupCount(); // nb =9
- TermeEntreLesPremieresBalises_mot1 = match.group(3); // null pointeur exception car premierTermeEntre1et2 vaut null
- TermeEntreLesPremieresBalises_mot2 = match.group(5);
- TermeEntreLesSecondesBalises_mot2 = match.group(7);
- TermeEntreLesSecondesBalises_mot1 = match.group(9);
-
-
- ...
- }
|
Or quand la phrase est "cell signal" , b vaut true. Alors qu'il n'y a meme pas les balises avec les #. Donc je ne comprenais pas. ça vient donc de la regex mais sauriez vous comment faire pr résoudre le pb ?
J'espère que j'ai été claire. Merci
Message édité par unknown_21 le 31-08-2005 à 16:28:55