[RegExp] exclure des sous chaines

exclure des sous chaines [RegExp] - Perl - Programmation

Marsh Posté le 30-01-2006 à 16:31:24    

Bonjour à tous, avant de ne plus avoir un cheveux sur la tête je poste mon soucis ^^
 
j'essayer de valider ce genre de condition :  
" $chaine ne commence pas par // contient } et ne se termine pas par */"  
 
ca me donne un truc dans le genre :  

Code :
  1. if ( $chaine =~ /^[^\/\/]*}[^\*\/]*$/ ) {


 
evidement ca ne fonctionne pas car mes conditions entre crochet ne matchent pas des chaines mais des suites de caractères... oui mais voila la question justement :D  
 
donc si je teste sur ces exemples :  

Code :
  1. }   */
  2.   } //   
  3. // }
  4. sfs }
  5. } tralala;


 
seuls les 3 derniers sont bien identifiés, le 2 devrait l'être aussi (enfin avec la bonne expression bien sur ;) )  
 
help !  :(

Reply

Marsh Posté le 30-01-2006 à 16:31:24   

Reply

Marsh Posté le 30-01-2006 à 17:52:31    

le mieux c'est souvent de faire plusieurs regexp dans ce cas. c'est plus simple et pas forcement beaucoup plus lent
 

Code :
  1. if (
  2.     $chaine !~ m!^//! # $chaine ne commence pas par //
  3.     &&
  4.     $chaine =~ m!\}! # contient }
  5.     &&
  6.     $chaine !~ m!/$! # ne se termine pas par /
  7. ) {


 
mais sinon tu peux faire une belle grosse regexp si tu trouve ca plus clair (et que ca vaud le coup niveau vitesse)
 

Code :
  1. if ($chaine !~ !^//|^[^\}]*$|/!) {


 
vrai sauf si la chaine commence par //, ou ne contient que des caracteres autre que } ou est vide, ou fini par /


Message édité par pospos le 30-01-2006 à 17:54:03
Reply

Marsh Posté le 30-01-2006 à 18:12:49    

Citation :


Code :
  1. 1.
  2.       if (
  3.    2.
  4.          $chaine !~ m!^//! # $chaine ne commence pas par //
  5.    3.
  6.          &&
  7.    4.
  8.          $chaine =~ m!\}! # contient }
  9.    5.
  10.          &&
  11.    6.
  12.          $chaine !~ m!/$! # ne se termine pas par /
  13.    7.
  14.       ) {




 
j'y avais pensé à ca sauf que c'est pas bon car je ne cherche pas à savoir si la chaine se termine par */ mais seulement s'il n'y aurait pas un */ aprés un } (resp. un /* avant un {).  
 
là je n'ai pas ce genre de notion tu vois c'est ca que je ne parviens pas à formaliser :'(  
 
en gros je compte les accolades ouvrantes et fermantes pour parser du c++ (je fais de l'ajout automatique de code à certains endroits précis) et je suis actuellement embêté par ce genre de cas :  
 
} //commentaire  
-> je zappe l'accolade à cause du /  
 
n'est-il pas possible de formaliser "une chaine qui n'est pas */ répétée n fois ou 0" de la même facon que l'on peut écrire : [^a]* pour matcher une chaine ne contenant pas de a ?  
 
 

Reply

Marsh Posté le 31-01-2006 à 00:03:10    

deja c'est koi le * ?
tu cherche un * literal ?
 
si tu veux matcher des truc balancés genre parentheses alors je te conseil Text::Balanced
 
tu veux faire koi en fait?

Reply

Marsh Posté le 31-01-2006 à 10:36:28    

je compte les accolades ouvrantes et fermantes dans du code c++ afin de me situer dans ce code (premiere accolade de méthode, derniere etc etc).  
 
aussi je cherche à vérifier ce genre de truc :  
 

Code :
  1. bla bla bla }

-> accolade--

Code :
  1. } //commentaire

-> accolade--

Code :
  1. bla bla bla } /* commentaire

-> accolade--
 
mais pas ce genre de cas :  

Code :
  1. // comment }

-> pas accolade--

Code :
  1. } */

-> pas accolade--
 
tu vois ce que je veux dire ?  
 
 

Reply

Marsh Posté le 31-01-2006 à 10:40:57    

Je pense avoir trouvé, en fait ta solution était quasiement la bonne, il fallait juste ajouter les notions d'ordre ;)  
 
 
il doit y avoir plus simple et plus robuste surtout (je vais louper les "} /* blabla */ mais c'est pas grave) :  
 

Code :
  1. if ( $chaine !~ /^.*\/\/.*\}.*$/
  2.   && $chaine =~ /^.*\}.*$/
  3.   && $chaine !~ /^.*\}.*\*\/$/


 
Merci beaucoup pour ton aide pospos

Reply

Sujets relatifs:

Leave a Replay

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