expression régulière: b vaut true au lieu de false

expression régulière: b vaut true au lieu de false - Java - Programmation

Marsh Posté le 31-08-2005 à 14:46:16    

Bonjour,
 
J'ai un problème avec les expressions régulières. J'ai un match.find() qui vaut true alors qu'il est censé valoir false. Donc ça rentre ds ma boucle while, et qd je cherche un match.group() en particulier, j'ai une null pointeur exception.
 
L'expression régulière est de la forme suivante:

Code :
  1. Pattern regex = Pattern.compile("((mot1([^#]*?)mot2([^#]*?)mot3([^#]*?)mot4)||(mot3([^#]*?)mot4([^#]*?)mot1([^#]*?)mot2))" );
  2. Matcher match = regex.matcher(phrase[i]); //texte découpé en phrases
  3. boolean b = match.find();
  4. while (b==true){          //la phrase ne contient pas le motif de la regex et pourtant b vaut true
  5.    int nb = match.groupCount();        // nb =9
  6.    premierTermeEntre1et2 = match.group(3);   // null pointeur exception car premierTermeEntre1et2 vaut null
  7.    premierTermeEntre3et4 = match.group(5);
  8.    secondTermeEntre3et4 = match.group(7);
  9.    secondTermeEntre1et2 = match.group(9);
  10.  
  11. ...
  12. }


voilà, si vous avez une idée sur pourquoi b vaut true, ça m'intéresse.
Merci de votre aide.

Reply

Marsh Posté le 31-08-2005 à 14:46:16   

Reply

Marsh Posté le 31-08-2005 à 14:58:53    

mon idée serait que ta regex est foireuse [:pingouino]
 
tu l'as testée ? exhaustivement ? elle est censée faire quoi ? avec quelles String as tu testé ? avec quelle(s) String ca foire ?

Reply

Marsh Posté le 31-08-2005 à 15:04:12    

souk a écrit :

mon idée serait que ta regex est foireuse [:pingouino]


Quand je la colle dans Kodos, elle matche n'importe quoi (dans le sens qu'elle matche tout, si je lui file "mblskwdfngbsdlgkhndmlgbdfhbmdlhnbmdgbnsmbnsmgbngfjk" paf ça matche)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-08-2005 à 15:15:14    

tu peux répondre à mes questions ? [:pingouino]
 
et je sais pas ce qu'est kodos, ca m'avance pas des masses ...

Reply

Marsh Posté le 31-08-2005 à 15:17:03    

souk a écrit :

tu peux répondre à mes questions ? [:pingouino]


non
 
 
 
c'est pas moi l'auteur du topic, sakakaka [:pingouino]

Citation :

et je sais pas ce qu'est kodos, ca m'avance pas des masses ...


Un debugger d'expressions rationnelles


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-08-2005 à 15:22:10    

ah ouais tiens [:pingouino]
j'ai pas les yeux en face des trous mwé [:joce]
 
enfin spa grave quoi, tu confirmes que la regexp est foireuse :o
 

Reply

Marsh Posté le 31-08-2005 à 15:24:21    

Oui, je confirme même qu'elle est complètement moisie :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-08-2005 à 15:33:51    

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  :ouch: 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 :
  1. 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 :
  1. Pattern regex_1_2 = Pattern.compile("(#mot1#([^#]*?)##mot1##([^#]*?)#mot2#([^#]*?)##mot2##)" );
  2. Pattern regex_2_1 = Pattern.compile("(#mot2#([^#]*?)##mot2##([^#]*?)#mot1#([^#]*?)##mot1##)" );
  3. for (int i=0; i<phrase.length;i++){  //phrase est un tableau contenant chaque phrase du texte dans une case
  4.    Matcher match_1_2 = regex_1_2.matcher(phrase[i]);
  5.    while(match_1_2.find()){
  6.       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>";
  7.    }
  8.                  
  9.    Matcher match_2_1 = regex_2_1.matcher(phrase[i]);
  10.    while(match_2_1.find()){
  11.       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>";
  12.        }
  13. }


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 :
  1. //les regex st les memes que ds le code au dessus
  2. for (int i=0; i<phrase.length;i++){
  3.        
  4.    Matcher match_1_2 = regex_1_2.matcher(phrase[i]);
  5.    while(match_1_2.find()){
  6.      
  7.          terme1 = match_1_2.group(2);
  8.       Pattern regex_terme1 = Pattern.compile(terme1);
  9.           Matcher match_terme1 = regex_terme1.matcher(phrase[i]);
  10.           while (match_terme1.find())
  11.                      phrase12=phrase[i].replaceAll(terme1,"<font style=\"background-color:#33CCFF\">"+terme1+"</font>" );
  12.      
  13.       terme2 = match_1_2.group(4);
  14.       Pattern regex_terme2 = Pattern.compile(terme2);
  15.       Matcher match_terme2 = regex_terme2.matcher(phrase[i]);
  16.       while (match_terme2.find())
  17.                 phrase12=phrase12.replaceAll(terme2,"<font style=\"background-color:#FFFF00\">"+terme2+"</font>" );
  18.              
  19.        total12 += phrase12;
  20.             }
  21.              
  22.    Matcher match_2_1 = regex_2_1.matcher(phrase[i]);
  23.    while(match_2_1.find()){
  24.                
  25.           terme2 = match_2_1.group(2);
  26.       Pattern regex_terme2 = Pattern.compile(terme2);
  27.           Matcher match_terme2 = regex_terme2.matcher(phrase[i]);
  28.       if (match_terme2.find())
  29.                phrase21=phrase[i].replaceAll(terme2,"<font style=\"background-color:#FFFF00\">"+terme2+"</font>" );
  30.                
  31.           terme1 = match_2_1.group(4);
  32.       Pattern regex_terme1 = Pattern.compile(terme1);
  33.       Matcher match_terme1 = regex_terme1.matcher(phrase[i]);
  34.       if (match_terme1.find())
  35.                 phrase21=phrase21.replaceAll(terme1,"<font style=\"background-color:#33CCFF\">"+terme1+"</font>" );
  36.                
  37.    total21 += phrase21;
  38.    }
  39. }


 
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 :
  1. Pattern regex = Pattern.compile("((#mot1#([^#]*?)##mot1##([^#]*?)#mot2#([^#]*?)##mot2##)||(#mot2#([^#]*?)##mot2##([^#]*?)#mot1#([^#]*?)##mot1##))" );
  2. Matcher match = regex.matcher(phrase[i]); //texte découpé en phrases
  3. boolean b = match.find();
  4. while (b==true){          //la phrase ne contient pas le motif de la regex et pourtant b vaut true
  5.        int nb = match.groupCount();        // nb =9
  6.        TermeEntreLesPremieresBalises_mot1 = match.group(3);   // null pointeur exception car premierTermeEntre1et2 vaut null
  7.        TermeEntreLesPremieresBalises_mot2 = match.group(5);
  8.        TermeEntreLesSecondesBalises_mot2 = match.group(7);
  9.        TermeEntreLesSecondesBalises_mot1 = match.group(9);
  10.          
  11.  
  12. ...
  13. }


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
Reply

Marsh Posté le 31-08-2005 à 16:30:49    

Je confirme le fait que la regex ne fonctionne pas car j'ai fait un test en prenant directement une phrase que j'ai moi meme écrite et non depuis le texte. Et là aussi, b vaut true alors qu'il ne devrait pas. Donc on rentre tjs ds la boucle donc j'ai tjs une null pointeur exception. Qu'est ce qui ne va pas dans mon expression régulière ?
Merci  
 

Code :
  1. Pattern regex = Pattern.compile("((#mot1#([^#]*?)##mot1##([^#]*?)#mot2#([^#]*?)##mot2##)||(#mot2#([^#]*?)##mot2##([^#]*?)#mot1#([^#]*?)##mot1##))" );
  2. for (int i=0; i<phrase.length;i++){
  3.      
  4.    String essai="bonjour, nous sommes mercredi";
  5.    Matcher match = regex.matcher(essai);
  6.    boolean b = match.find();   //b vaut true !!!
  7.      
  8.    while (b==true){
  9.        int nb = match_gene_processus.groupCount();  //tjs 9
  10.       TermeEntreLesPremieresBalises_mot1 = match.group(3);   // null pointeur exception car premierTermeEntre1et2 vaut null
  11.       TermeEntreLesPremieresBalises_mot2 = match.group(5);
  12.       TermeEntreLesSecondesBalises_mot2 = match.group(7);
  13.       TermeEntreLesSecondesBalises_mot1 = match.group(9);

Reply

Marsh Posté le 31-08-2005 à 17:08:09    

Ce qui ne va pas, je sais pas, mais comment t'aider toi même ça je le sais: avec un débugger de regex.
 
Personnellement j'utilise Kodos, il est principalement orienté Python mais il permet de faire du debug sur tous les langages gérant les PRE (les REs Perl, par opposition aux regex POSIX)
 
Plus gros et plus complexe, RegexBuddy de chez Regular-Expressions.info (extrèmement bon site, par ailleurs, probablement le meilleur site sur les REs)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 31-08-2005 à 17:08:09   

Reply

Marsh Posté le 31-08-2005 à 18:47:47    

ok je te remercie. J'utiliserai ça la prochaine fois. Je ne connaissais pas.  
J'ai fini (enfin!) par trouver l'erreur ds la regex: c'est le ou: j'ai mis 2 | et il en faut qu'un. Donc apparemment, ça doit considérer que j'ai mis un caractère vide dc n'importe quel caractère, c'est pour ça que ça rentre tjs ds la boucle.
 
Merci
a+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed