\W est l'opposé de \w, c'est à dire tous les caractères non-mots (',+-` ....) ça ne correspond pas à ta chaîne.
--
Jedaï
Version imprimable
\W est l'opposé de \w, c'est à dire tous les caractères non-mots (',+-` ....) ça ne correspond pas à ta chaîne.
--
Jedaï
Et comme je dis depuis ce matin (voir posts en page 1), avec une telle expression régulière reposant sur autant de critères, il vaut mieux faire une ébauche de regexp plutôt que de se lancer tout de go et en un seul jet sur une regexp traitant toute la chaîne.
Parce qu'en cas d'erreur, tu es obligé de faire machine arrière pour trouver où ça coince.
En construisant ta regexp, valeur recherchée par valeur recherchée, au fur et à mesure elle va prendre forme et finir par faire ce que tu souhaites.
C'est ainsi que j'ai procédé pour les exemples que je t'ai donné : construire mon début de regexp pour trouver la date, puis l'heure, etc.
Alors direction la machine à café, un p'tit coup dehors pour prendre un bon bol d'air frais (s/frais/chaud/; :aie: ) et au boulot :yaisse2:
voila mon nouveau test sans résultatCode:
1
2
3
4
5
6
7
8 $Phrase = "!! *A0628/399 /07-05-15"; if($Phrase =~ m{^\!+\s+\*(\[\w\d]+)\/(\d{3})\s+\/(\d{2}\-\d{2}\-\d{2})$}x ) { my $date = $3; print 'date: '.$date."\n"; }
Tu peux également construire ta regex à partir de blocs plus petits auxquels tu donne des noms, non seulement c'est plus robuste et il est plus facile de trouver l'erreur mais en plus ça fait du code autodocumenté.
Un exemple, pour parser une date sous la forme "aaaa/mm/dd HH:MM:SS", tu peux soit faire la regex entière
, soit écrire :Code:my ($year, $month, $day, $hour, $min, $sec) = ($date =~ m/(\d{1,4})\/(\d{1,2})\/(\d{1,2})\s+(\d\d):(\d\d):(\d\d)/);
N'est-ce pas plus clair ? (La plupart des gens répondent non à ce stade, mais changent d'avis lorsque la regex commence à grossir...)Code:
1
2
3
4
5
6 my $rx_date = qr{(\d{1,4})/(\d{1,2})/(\d{1,2})}; my $rx_hour = qr{(\d\d):(\d\d):(\d\d)}; my $rx_datetime = qr{$rx_date \s+ $rx_hour}x; my ($year, $month, $day, $hour, $min, $sec) = ($date =~ m/$rx_datetime/);
--
Jedaï
Il y a un backslash de trop avant le [ de la classe de caractère [\w\d]...Citation:
Envoyé par mariafan
--
Jedaï
Sauf erreur, ta regexp ne remplit pas ses fonctions sur tout ce que tu recherches avant $3, soit tout le bloc de la chaine avant la date.Citation:
Envoyé par mariafan
Et sinon, pourquoi mémoriser $1 et $2 si tu ne t'en sers pas ?
Edit : enlève le motif $ en fin de chaine
Version corrigée pour le début de regexp que tu donnes, ca marche cette fois
Code:if($Phrase =~ m{^\!+\s+\*([\w\d]+)\/(\d{3})\s+\/(\d{2}\-\d{2}\-\d{2})}x )
Il y a une raison particulière pour échapper "-" ? Et pourquoi échapper "/" si on prend des délimiteurs alternatifs ?