[Perl] Y a-t-il un dieu des expressions régulières dans la salle?

Y a-t-il un dieu des expressions régulières dans la salle? [Perl] - Perl - Programmation

Marsh Posté le 02-12-2002 à 12:05:12    

tous ce qui commence par un "/" suivi d'un "-" apres un nombre entre "1" et "9" puis une lettre en minuscule entre "a" et "z" et un "_", tous ca repete zero ou plusieurs fois.
 
ensuite un autre "/" et puis n'importe quoi apres jusqu'a la fin
 
tu recupere ds $1 ce qu'il y a avant le 2eme "/" et ds $2 ce qu'il y a apres
 
bon suis sur que me suis gourre quelques part... ;)

Reply

Marsh Posté le 02-12-2002 à 12:05:12   

Reply

Marsh Posté le 02-12-2002 à 13:48:55    

xlA a écrit a écrit :

 
Honnêtement... Je pense que oui :D merci qd même pour la tentative :p




 
ben en fait y a que le premier "-" et le "_" ou je susi pas sur de la signification
mais sinon le reste a prioris g juste...

Reply

Marsh Posté le 02-12-2002 à 14:22:28    

Me semble que ce qu'a dit djtoz est pas loin de la vérité.
 
Seule différence, ce qui est en gras:  
 
1) doit commencer par un /
 
2)ensuite, chaîne pouvant contenir des chiffres entre 1 et 9, des caractères entre a et z, et/ou des - et/ou des _, le tout en quantité infinie...
 
3)/
4)fin à choix
 
Donc
 
/abc_123-zz/xxx par exemple, serait correct.
 
Ce qu'il y a entre [] n'indique pas un ordre d'apparition, mais les caractères possibles.
 
J'epère que c'est clair
 
Bref : chemin de fichiers...
 
Edit : par contre je sais pas ce qu'est le m# (connais rien en Perl ;) )


Message édité par deliriumtremens le 02-12-2002 à 14:24:21
Reply

Marsh Posté le 02-12-2002 à 14:37:03    

ben le m veut dire match, donc ce qui va matcher la regex
 
et pis par defaut c'est le caractere "/" qui delimite la regex, mais tu peut en utiliser d'autre et dans ce cas la, ben c'est le "#" qui sert de delimiteur.

Reply

Marsh Posté le 02-12-2002 à 14:40:00    

djtoz a écrit a écrit :

ben le m veut dire match, donc ce qui va matcher la regex
 
et pis par defaut c'est le caractere "/" qui delimite la regex, mais tu peut en utiliser d'autre et dans ce cas la, ben c'est le "#" qui sert de delimiteur.




tu es une perl(e)  :jap:

Reply

Marsh Posté le 02-12-2002 à 15:02:02    

^ = début de l'expression à tester (ce qui suit le ^ = le premier caractère à tester)
 
$ = fin de l'expression à tester

Reply

Marsh Posté le 02-12-2002 à 17:43:55    

deliriumtremens a écrit a écrit :

^ = début de l'expression à tester (ce qui suit le ^ = le premier caractère à tester)
 
$ = fin de l'expression à tester




 
petite precision
^ ca correspond au debut de la ligne
et $ la fin de la ligne
 
c'est peut etre ce que tu voulais dire, mais alors j'ai mal compris et je m en excuse par avance :D
 
pis juste pour info le "m" n'est pas necessaire ds ce cas.


Message édité par djtoz le 02-12-2002 à 17:45:33
Reply

Marsh Posté le 04-12-2002 à 08:18:01    

Tiens, en parlant de "dieu des RegExp", si y en a un qui pouvait me donner la RegExp au problème suivant :
 
$toto contient une chaîne contenant des espaces éventuels et des chiffres
 
quand par exemple $toto contient ceci "    1224   ", je veux récupérer "1224"
quand $toto contient "   1 2 3 4  ", je veux récupérer "1 2 3 4"
 
j'ai fait qq tests mais c'est pas tjs concluant, qqun a la solution ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 04-12-2002 à 08:38:58    

Aricoh a écrit a écrit :

Tiens, en parlant de "dieu des RegExp", si y en a un qui pouvait me donner la RegExp au problème suivant :
 
$toto contient une chaîne contenant des espaces éventuels et des chiffres
 
quand par exemple $toto contient ceci "    1224   ", je veux récupérer "1224"
quand $toto contient "   1 2 3 4  ", je veux récupérer "1 2 3 4"
 
j'ai fait qq tests mais c'est pas tjs concluant, qqun a la solution ?




 
my ($recup) = $toto =~ /^\s*(.*)\s*$/
 
essai ca

Reply

Marsh Posté le 04-12-2002 à 08:53:42    

merci pour ta propal mais ça donne les mêmes résultats que chez moi, exemple de code :
 

Code :
  1. my @Liste = ( "TOTO 1224 TOTO",
  2.  "TOTO  1224   TOTO",
  3.  "TOTO   1 224   TOTO",
  4.  "TOTO    12 24  TOTO",
  5.  "TOTO    122 4  TOTO",
  6.  "TOTO   1 2 24  TOTO",
  7.  "TOTO  1 2  2  4   TOTO",
  8.  "TOTO    1 2 2 4   TOTO",
  9.  "TOTO   12 2 4   TOTO",
  10.  "TOTO   12 24    TOTO" );
  11. open(LOG, ">toto.log" ) or die();
  12. for(my $i = 0; $i < scalar(@Liste); ++$i) {
  13.     $_ = $Liste[$i];
  14.     print LOG "Ligne ", $i+1, " = ";
  15.     if (/^TOTO\s*(.*)\s*TOTO$/) {
  16. print LOG "\"$1\"\n";
  17.     } else {
  18. print LOG "no matching\n";
  19.     }
  20. }


 
Le retour de l'analyse écrite dans le log donne ça :

Code :
  1. Ligne 1 = "1224 "
  2. Ligne 2 = "1224   "
  3. Ligne 3 = "1 224   "
  4. Ligne 4 = "12 24  "
  5. Ligne 5 = "122 4  "
  6. Ligne 6 = "1 2 24  "
  7. Ligne 7 = "1 2  2  4   "
  8. Ligne 8 = "1 2 2 4   "
  9. Ligne 9 = "12 2 4   "
  10. Ligne 10 = "12 24    "


 
Mon blème, les espaces devant le 1er chiffre, ça roule je les récupère pas, par contre je conserve les espaces APRES le dernier nombre, ça marche pas comme je veux


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 04-12-2002 à 08:53:42   

Reply

Marsh Posté le 04-12-2002 à 10:14:18    

bah alors djtoz, t passé où ?  ;)
 
y a personne qu'a la soluce ?  :cry:


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 04-12-2002 à 10:50:41    

ben c normal! tu prends tout ds ta regexp!
mets plutôt un truc genre (\d+) au lieu de (.*)

Reply

Marsh Posté le 04-12-2002 à 10:50:42    

Aricoh a écrit a écrit :

bah alors djtoz, t passé où ?  ;)
 
y a personne qu'a la soluce ?  :cry:  




 
ben si c tjours 1224:
 
my ($recup) = $toto =~ /^\s*(1.*4)\s*$/


Message édité par djtoz le 04-12-2002 à 10:55:13
Reply

Marsh Posté le 04-12-2002 à 10:58:13    

arghbis a écrit a écrit :

ben c normal! tu prends tout ds ta regexp!
mets plutôt un truc genre (\d+) au lieu de (.*)




 
oue mais la si y a des espaces entre les nombres, ca va po le faire :/

Reply

Marsh Posté le 04-12-2002 à 11:03:08    

certes, mais je donne une piste, y peut chercher qd même non??  
sinon : (\s*(\d+)\s*)+ ça marche :whistle:

Reply

Marsh Posté le 04-12-2002 à 11:03:14    

djtoz a écrit a écrit :

 
 
ben si c tjours 1224:
 
my ($recup) = $toto =~ /^\s*(1.*4)\s*$/



ben non, les chiffres sont aléatoires  :lol:  
 
En fait, il faut que je récupère ces chiffres, et tester si c'est bien des int
 
Ainsi, si j'ai trouvé "1224", conversion en int OK
Si je trouve "1 2 24", ben là c'est pas OK
 
C'est ça qu'il faut que je vérifie au final mais avant tout, je dois me débarrasser de tous les espaces AVANT et APRES cette chaîne.
 
Pour l'instant, je fais comme ça :

Code :
  1. my $chaine = "   12 24    ";
  2. while ($chaine =~ /^ (.+)$/) {
  3.     $chaine = $1;
  4. }
  5. while ($chaine =~ /^(.+) $/) {
  6.     $chaine = $1;
  7. }


Avec ça, si au départ j'ai "   12 24   ", au final je récupère bien ce que je veux, c-a-d "12 24"
 
Seulement, c'est pas tip top niveau syntaxique ni en tps de traitement car mon blème, c'est que des vérifs de valeur comme celle-ci, j'en ai une bonne centaine à faire !  :??:


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 04-12-2002 à 11:38:17    

bon c pas non plus tip top
mais celle la elle marche
 
/^\s*(\d[\s*|\d]+\d)\s*$/


Message édité par djtoz le 04-12-2002 à 11:39:12
Reply

Marsh Posté le 04-12-2002 à 11:38:53    

djtoz a écrit a écrit :

bon c pas non plus tip top
mais celle la elle marche
 
/^\s*([\s*|\d]+\d)\s*$/



attend, je teste tout d'suite !


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 04-12-2002 à 11:42:03    

djtoz a écrit a écrit :

bon c pas non plus tip top
mais celle la elle marche
 
/^\s*(\d[\s*|\d]+\d)\s*$/



yes yes YES !!!
 
Ca donne ça en retour :
Ligne 1 = "1224"
Ligne 2 = "1224"
Ligne 3 = "1 224"
Ligne 4 = "12 24"
Ligne 5 = "122 4"
Ligne 6 = "1 2 24"
Ligne 7 = "1 2  2  4"
Ligne 8 = "1 2 2 4"
Ligne 9 = "12 2 4"
Ligne 10 = "12 24"
 
Ca marche mais j'ai pas tout capté à ta RegExp, merci gars !  :jap:


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 04-12-2002 à 11:46:42    

Aricoh a écrit a écrit :

yes yes YES !!!
 
Ca donne ça en retour :
Ligne 1 = "1224"
Ligne 2 = "1224"
Ligne 3 = "1 224"
Ligne 4 = "12 24"
Ligne 5 = "122 4"
Ligne 6 = "1 2 24"
Ligne 7 = "1 2  2  4"
Ligne 8 = "1 2 2 4"
Ligne 9 = "12 2 4"
Ligne 10 = "12 24"
 
Ca marche mais j'ai pas tout capté à ta RegExp, merci gars !  :jap:  




 
/^\s*(\d[\s*|\d]+\d)\s*$/
 
ben en fait  
^\s* :       les premier espaces (zero ou plusieurs)
(\d :       un nombre
[\s*|\d]+ : soit zero ou plusieurs espaces ou alors un nombre (repete une fois ou plusieurs)
\d)         un nombre
\s*$ :      les derniers espaces
 
voilou


Message édité par djtoz le 04-12-2002 à 11:47:51
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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