ordre dans les expressions régulières

ordre dans les expressions régulières - Java - Programmation

Marsh Posté le 29-06-2005 à 14:49:36    

Bonjour,
j'ai un pb avec les expressions régulières. J'utilise des OR.
J'ai une phrase de ce type:

Code :
  1. contenu =" #aaaaaa# a1 ##aaaaaa## fonctionne #bbbbbb# b1 ##bbbbbb## et #aaaaaa# a2 ##aaaaaa## role dans #cccccc# c1 ##cccccc##";


Je souhaite récupérer:

Code :
  1. a1 fonctionne b1
  2. a2 role dans c1


Voici le code:

Code :
  1. String total="";
  2. Pattern regex = Pattern.compile("(#aaaaaa#(.*?)##aaaaaa##(.*?)#cccccc#(.*?)##cccccc##)|"+"(#aaaaaa#(.*?)##aaaaaa##(.*?)#bbbbbb#(.*?)##bbbbbb##)" );
  3. Matcher match_tout = regex.matcher(contenu);
  4. while(match_tout.find()){     
  5.          
  6.    if (match_tout.group(1) != null){
  7.       total += match_tout.group(2)+match_tout.group(3)+match_tout.group(4)+"<br>";
  8.       System.out.println("match 2 = "+match_tout.group(2));
  9.       System.out.println("match 3 = "+match_tout.group(3));
  10.       System.out.println("match 4 = "+match_tout.group(4));
  11.    }
  12.    else
  13.    if (match_tout.group(5) != null){
  14.       total += match_tout.group(6)+match_tout.group(7)+match_tout.group(8)+"<br>";
  15.       System.out.println("match 6 = "+match_tout.group(6));
  16.       System.out.println("match 7 = "+match_tout.group(7));
  17.       System.out.println("match 8 = "+match_tout.group(8));
  18.    }
  19. }


donc l'ordre est :
ordre contenu : a b a c
ordre regex : a c a b  
et j'obtiens:

Code :
  1. match 2 =  a1
  2. match 3 =  fonctionne #bbbbbb# b1 ##bbbbbb## et #aaaaaa# a2 ##aaaaaa## role dans
  3. match 4 =  c1


 
Si je fais:

Code :
  1. contenu =" #aaaaaa# a1 ##aaaaaa## fonctionne #bbbbbb# b1 ##bbbbbb## et #aaaaaa# a2 ##aaaaaa## role dans #cccccc# c1 ##cccccc##";
  2. String total="";
  3. Pattern regex_tout = Pattern.compile("(#aaaaaa#(.*?)##aaaaaa##(.*?)#bbbbbb#(.*?)##bbbbbb##)|"+"(#aaaaaa#(.*?)##aaaaaa##(.*?)#cccccc#(.*?)##cccccc##)" );
  4. Matcher match_tout = regex_tout.matcher(contenu);
  5. while(match_tout.find()){     
  6.          
  7.    if (match_tout.group(1) != null){
  8.       total += match_tout.group(2)+match_tout.group(3)+match_tout.group(4)+"<br>";
  9.       System.out.println("match 2 = "+match_tout.group(2));
  10.       System.out.println("match 3 = "+match_tout.group(3));
  11.       System.out.println("match 4 = "+match_tout.group(4));
  12.    }
  13.    else
  14.    if (match_tout.group(5) != null){
  15.       total += match_tout.group(6)+match_tout.group(7)+match_tout.group(8)+"<br>";
  16.       System.out.println("match 6 = "+match_tout.group(6));
  17.       System.out.println("match 7 = "+match_tout.group(7));
  18.       System.out.println("match 8 = "+match_tout.group(8));
  19.    }
  20. }


donc ici, l'ordre est :
ordre contenu : a b a c
ordre regex : a b a c
j'obtiens ce qu'il faut cad:

Code :
  1. match 2 =  a1
  2. match 3 =  fonctionne
  3. match 4 =  b1
  4. match 6 =  a2
  5. match 7 =  role dans
  6. match 8 =  c1


Le probleme c'est que je ne connais pas à l'avance l'ordre de mes balises #...# dans la string contenu. Donc comment faire ?
Merci
 

Reply

Marsh Posté le 29-06-2005 à 14:49:36   

Reply

Marsh Posté le 29-06-2005 à 15:48:32    

ameliorer ta regex!
 
au lieu d'ecrire en dur #aaaaaa# plutot un truk du genre #*#

Reply

Marsh Posté le 29-06-2005 à 16:09:05    

C'est quoi qui a motivé ton choix d'utiliser des regex, dans ce cas?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-06-2005 à 16:35:43    

slt,
merci d'avoir répondu. Je ne peux pas utiliser ta solution rits75 car si je fais comme ça, je ne peux pas différencier ce que je récupère. Or, selon les balises #, le traitement (non ecrit ici) est différent.
et the real--, en fait c pas moi qui est choisi d'utiliser les regex mais on me l'a demandé.
bon sinon, le code suivant répond à mon pb (je précise, ce n'est pas moi qui ai trouvé...)

Code :
  1. Pattern regex= Pattern.compile("(#aaaaaa#([^#]*?)##aaaaaa##([^#]*?)#cccccc#([^#]*?)##cccccc##)|"+"(#aaaaaa#([^#]*?)##aaaaaa##([^#]*?)#bbbbbb#([^#]*?)##bbbbbb##)" );


Merci quand meme
a+

Reply

Marsh Posté le 29-06-2005 à 17:09:48    

(que ce soit toi ou pas qui l'ait choisi, je m'en fous un peu, je suis juste curieux de savoir pourquoi ce choix... à moins que ça soit interdit de remettre en question les choses qu'on t'impose, chez toi ?)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-06-2005 à 18:03:22    

le but du programme que je dois faire est de récupérer à partir d'un texte, des segments de phrases qui sont balisés (avec #). Pour chaque type de balises, je dois faire un certain traitement. On m'a donc dit de le faire avec des regex. Je sais pas si c'est le mieux. J'avais essayé autre chose : parcourir le texte et à chaque mot qui equals mes balises, récupérer les segments.

Reply

Sujets relatifs:

Leave a Replay

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