Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1539 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1188677
unknown_21
Posté le 31-08-2005 à 14:46:16  profilanswer
 

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.

mood
Publicité
Posté le 31-08-2005 à 14:46:16  profilanswer
 

n°1188687
souk
Tourist
Posté le 31-08-2005 à 14:58:53  profilanswer
 

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 ?

n°1188691
masklinn
í dag viðrar vel til loftárása
Posté le 31-08-2005 à 15:04:12  profilanswer
 

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
n°1188700
souk
Tourist
Posté le 31-08-2005 à 15:15:14  profilanswer
 

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

n°1188701
masklinn
í dag viðrar vel til loftárása
Posté le 31-08-2005 à 15:17:03  profilanswer
 

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
n°1188705
souk
Tourist
Posté le 31-08-2005 à 15:22:10  profilanswer
 

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
 

n°1188706
masklinn
í dag viðrar vel til loftárása
Posté le 31-08-2005 à 15:24:21  profilanswer
 

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
n°1188712
unknown_21
Posté le 31-08-2005 à 15:33:51  profilanswer
 

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
n°1188796
unknown_21
Posté le 31-08-2005 à 16:30:49  profilanswer
 

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);

n°1188846
masklinn
í dag viðrar vel til loftárása
Posté le 31-08-2005 à 17:08:09  profilanswer
 

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
mood
Publicité
Posté le 31-08-2005 à 17:08:09  profilanswer
 

n°1188981
unknown_21
Posté le 31-08-2005 à 18:47:47  profilanswer
 

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+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[W3C] Le pb des href="javascript:return false;" dans une url...expression reguliere
JavaScript Expression RégulièreTidy sous FireFox, ça vaut quoi ?
Expression regulierePHP et expression regulières HELP !
WebLogic 8.1 et request.getSession(false) 
Plus de sujets relatifs à : expression régulière: b vaut true au lieu de false


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR