expression reguliere,recuperer une valeur

expression reguliere,recuperer une valeur - Perl - Programmation

Marsh Posté le 04-01-2007 à 11:01:31    

salut,
 
Dans un fichier je recupere une ligne
et dans la ligne recuperer je souhaiterai recuperer une valeur,
pour comprendre voila :
 
Je recupere $x et à partir de cette ligne, je ne souhaite conserver que le nom du fichier;
donc j'ai fait cela mais apparament ça ne fonctionne pas, car il me retourne la ligne complete au lieu de seulement
essai.sh

Code :
  1. my $x = 'FILE="essai.sh" SIZE="32"';
  2. $x    =~ s/^FILE="(\w+)" SIZE$/$1/;
  3.     print "Nom du fichier =   $x\n";


 
Merci

Reply

Marsh Posté le 04-01-2007 à 11:01:31   

Reply

Marsh Posté le 04-01-2007 à 11:13:22    

Déjà, ça marche pas à cause de ta regexp qui impose que SIZE soit à la fin de la ligne. Sinon, pour détecter ce genre d'erreurs, tu devrais tester si la regexp a matché ou pas. Perso, je ferais plutôt comme ça :

Code :
  1. my $x = 'FILE="essai.sh" SIZE="32"';
  2. if ($x =~ /^FILE="(\w+)" SIZE="(\d+)"$/)
  3. {
  4.   print "Nom du fichier = $1\n";
  5.   print "Taille du fichier = $2\n";
  6. }
  7. else
  8. {
  9.   print STDERR "Mauvais format de ligne: `$x'\n";
  10. }


---------------
TriScale innov
Reply

Marsh Posté le 04-01-2007 à 11:24:06    

j'ai tester ton code
et j'ai cela

Citation :


Mauvais format de ligne: `FILE="essai.sh" SIZE="32"'

Reply

Marsh Posté le 04-01-2007 à 11:38:09    

ouais, il y avait une autre erreur dans la regexp : \w ne permet pas de matcher le caractère '.'
 
Comme ça, ça marche :

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. my $x = 'FILE="essai.sh" SIZE="32"';
  4. if ($x =~ /^FILE="([^\"]+)" SIZE="(\d+)"$/)
  5. {
  6.     print "Nom du fichier = $1\n";
  7.     print "Taille du fichier = $2\n";
  8. }
  9. else
  10. {
  11.     print STDERR "Mauvais format de ligne: `$x'\n";
  12. }


---------------
TriScale innov
Reply

Marsh Posté le 04-01-2007 à 15:28:31    

j'ai modifié le $x et le code
et ça plante maintenant

Code :
  1. my $x = '<PROCESS FILE="essai".sh" SIZE="32" SYSTEM="32Bit">';
  2. if ($x =~ /FILE="([^\"]+)" SIZE="(\d+)"$/)
  3. {   
  4. print "Nom du fichier = $1\n";   
  5. print "Taille du fichier = $2\n";
  6. }else
  7. {   
  8. print STDERR "Mauvais format de ligne: `$x'\n";
  9. }


 
est ce que c'est à cause de cette partie qui dit que $1 doit être egal à une chaine qui commence et fini par un "
FILE="([^\"]+)"

Reply

Marsh Posté le 04-01-2007 à 16:18:09    

C'est la même erreur qu'au début : à cause du $ terminal, ta regexp ne matche que si "SIZE=??" se trouve à la fin de la ligne, ce qui n'est pas le cas puisque tu as ajouté le champ SYSTEM

 

modifie ta regexp pour la rendre plus souple. Il faut qu'elle accepte tous les types de lignes valides possibles, sans pour autant matcher n'importe quoi. Par exemple tu pourrais assouplir ta regexp comme ça:

/FILE="([^\"]+)"\s+SIZE="(\d+)"/



Message édité par franceso le 04-01-2007 à 16:18:23

---------------
TriScale innov
Reply

Marsh Posté le 04-01-2007 à 17:07:40    

si quelqu'un aurait un tutos sur les expression reguliere, mieuw que celui que j'ai hesité pas

Reply

Marsh Posté le 05-01-2007 à 08:58:00    

donny3 a écrit :

si quelqu'un aurait un tutos sur les expression reguliere, mieuw que celui que j'ai hesité pas


 
Rien ne vaut la documentation officielle :  
http://perldoc.perl.org/perlre.html
 
Et pour faciliter les tests, il y a ce site qui permet de tester ses expressions régulières, ça simplifie la vie :  
http://www.regextester.com
 
[:dawa]

Reply

Marsh Posté le 05-01-2007 à 09:31:46    

et perso je rajouterais ce petit cheat sheet pour les trous de mémoire

Reply

Marsh Posté le 05-01-2007 à 10:01:53    

Le nom du site [:god]

Reply

Marsh Posté le 05-01-2007 à 10:01:53   

Reply

Marsh Posté le 05-01-2007 à 15:52:49    

Merci pour les liens
c'est quoi l'interet de se site
http://www.regextester.com  

Reply

Marsh Posté le 05-01-2007 à 16:00:22    

L'intérêt ?
Tu colles une regexp dans la case regexp, un texte sur lequel appliquer la regexp, dans la case texte, tu choisis le type d'expression à appliquer (pour PERL c'est Preg), tu choisis des options, et tu zieutes si ta regexp fonctionne bien comme tu veux.
 
Quand c'est pour vérifier des regexp qui ne s'enclenchent que lorsque des conditions précises sont résolues dans le programme, c'est pratique.

Reply

Marsh Posté le 09-01-2007 à 11:00:30    

Merci pour le site http://www.regextester.com , je connaissais pas et c'est bien pratique.

Reply

Sujets relatifs:

Leave a Replay

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