Bonjour,

J'ai un souci avec une expression régulière.

J'ai un fichier composé de n extraits.
Chaque extrait est un ensemble de plusieurs lignes commençant toujours par :H10:HUB101 et ensuite, on peut avoir n’importe quoi. Il n’y a donc aucun signe distinctif pour indiquer que l’on arrive à la fin de l’extrait tant que l’on n’a pas rencontré le prochain :H10:HUB101 (qui est le début de l’extrait suivant)


Dans l’exemple ci-dessous, on peut donc voir 3 extraits.


:H10:HUB101
:H15:V0002
:H20:H05700809
:H30:080226134
:H61:
:H65:CH03A
:21:VSLA120080200106
7D:SETE GENRLE

F-800 miens
:9:/F630003021100005825
F 800 Saint uveur

:H10:HUB101
:H15:V00S
:H20:H05700810
:H25:SEEEEE
:H30:00226134915
:20:20022600001
:21R:2022600001
:50H/0/35655801
VSL Innational AG
Amouzoka
Neuflrasse 11
302 Bn
:71A:SHA

:H10:HUB101
:H15:V0002
:H20:H05700811
:H25:XXXXX
:H30:00226134915
:20:20022600001
u du ember 91




Je cherche l’expression régulière qui me permettrait de faire une boucle sur chaque extrait du fichier.

Le principal souci, c’est que je n’arrive pas à faire dire à l’expression régulière quelque chose comme

« Reconnais l’extrait composé d’une ligne commençant par :H10:HUB101 et ensuite tout jusqu’au prochain :H10:HUB101 »

La difficulté c’est que le prochain :H10:HUB101 fait partie de l’extrait suivant.

Je pensais à une expression régulière comme :

(^:H10:HUB101.*?(?:(?!^:H10:HUB101)))

Mais cela ne marche pas.

Auriez-vous une idée ?

Voici toujours mon programme Perl

====================
#!/usr/bin/perl
# Effectue une boucle sur chaque extrait HUB101 du fichier filein

use File::Basename;

use strict;

# Initialisation
my $filein=undef;
my $fullfilein=undef;
my $extATrouver=undef;
my $nbExt=0;

undef $/;

$fullfilein = $ARGV[0];

# Ouverture en lecture du fichier 1 pour connaitre les relevés a récupérer
open(FILEIN, $fullfilein) or die "Fichier $fullfilein introuvable";

# lecture du fichier FILEIN
$filein = <FILEIN> ;
# Boucle sur chaque extrait HUB101
while ( $filein =~ m/(^:H10:HUB101.*?(?:(?!^:H10:HUB101)))/smg) {

$extATrouver = $1;

$nbExt++;

print "\nExtrait N° : ".$nbExt."\n";
print $extATrouver;

}

close(FILEIN) or die "Fermeture impossible $fullfilein: $!";;
print "Fin"."\n";