Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Cherche regexp!

4 réponses
Avatar
p_geni...
Bonjour,

je dois lire plusieurs fichiers ligne par ligne à la recherche de
blocs de texte.
Ces blocs doivent commencer par un ou plusieurs '!' (eventuellement
séparés par un ou plusieurs espaces). un peu comme une réponse à
un mail ou un post sur les newsgroups

# exemple du fichier texte

ligne normale bla bla bla
! ligne du bloc de niveau 1 ! mm !!!!!!
! encore une ligne du bloc 1
! ! ligne du bloc 2
ligne normale
!! une ligne d'un bloc de niveau 2
!! une ligne d'un bloc de niveau 2
! ! ! ligne du bloc de niveau 3
ligne normale
....
# fin exemple

J'ai trouvé une expression régulière pour identifier chaque ligne des
blocs recherchés

m/((?:\s*!)*)/; # regexp avec smiley


mais je veux plutôt idetifier chaque bloc ( début - fin ) et son niveau
(c.à.d le nbre de '!' au début)


je pense qu'il faut adapter cette regexp mais n'y arrive pas

merci de votre aide.
Pierre.
-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/

4 réponses

Avatar
Rue des Prairies
Bonjour,

je dois lire plusieurs fichiers ligne par ligne à la recherche de
blocs de texte.
Ces blocs doivent commencer par un ou plusieurs '!' (eventuellement
séparés par un ou plusieurs espaces). un peu comme une réponse à
un mail ou un post sur les newsgroups

# exemple du fichier texte

ligne normale bla bla bla
! ligne du bloc de niveau 1 ! mm !!!!!!
! encore une ligne du bloc 1
! ! ligne du bloc 2
ligne normale
!! une ligne d'un bloc de niveau 2
!! une ligne d'un bloc de niveau 2
! ! ! ligne du bloc de niveau 3
ligne normale
....
# fin exemple

J'ai trouvé une expression régulière pour identifier chaque ligne des
blocs recherchés

m/((?:s*!)*)/; # regexp avec smiley


mais je veux plutôt idetifier chaque bloc ( début - fin ) et son niveau
(c.à.d le nbre de '!' au début)


je pense qu'il faut adapter cette regexp mais n'y arrive pas

merci de votre aide.
Pierre.
-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/

Bonjour,


Je ne comprend pas bien ce que tu veux, mais si c'est avoir le nombre de
! pour chaque ligne, ceci fait peut-être l'affaire :

while(<$file>) {
$niv=0;
$niv++ while(s/^s*!//g);
$niv[$.] = $niv;
}

Olivier.

Avatar
Dav'
Bonjour,

Tout depends de ce qu'on veut faire avec les lignes identifiée comme
faisant partie d'un bloc .

Voici ma solution , en deux etapes : on matche les ! et ensuite on les
compte :

my $count =1 ;
my @niveau ;
my $ligne ;

while ( $ligne = <DATA>) {

if ( $ligne =~ m/^((?:s*!)+)/ ) {

@niveau = ( $1 =~ /!/g ) ;
print "La ligne $count est de niveau " , scalar @niveau, "n" ;

} else {

print "La ligne $count est normalen"

}

$count++

}

__DATA__
ligne normale bla bla bla
! ligne du bloc de niveau 1 ! mm !!!!!!
! encore une ligne du bloc 1
! ! ligne du bloc 2
ligne normale
!! une ligne d'un bloc de niveau 2

!! une ligne d'un bloc de niveau 2
! ! ! ligne du bloc de niveau 3
ligne normale


Le resultat est :

La ligne 1 est normale
La ligne 2 est de niveau 1
La ligne 3 est de niveau 1
La ligne 4 est de niveau 2
La ligne 5 est normale
La ligne 6 est de niveau 2
La ligne 7 est de niveau 2
La ligne 8 est de niveau 3
La ligne 9 est normale


Dav'



Bonjour,

je dois lire plusieurs fichiers ligne par ligne à la recherche de
blocs de texte.
Ces blocs doivent commencer par un ou plusieurs '!' (eventuellement
séparés par un ou plusieurs espaces). un peu comme une réponse à
un mail ou un post sur les newsgroups

# exemple du fichier texte

ligne normale bla bla bla
! ligne du bloc de niveau 1 ! mm !!!!!!
! encore une ligne du bloc 1
! ! ligne du bloc 2
ligne normale
!! une ligne d'un bloc de niveau 2
!! une ligne d'un bloc de niveau 2
! ! ! ligne du bloc de niveau 3
ligne normale
....
# fin exemple

J'ai trouvé une expression régulière pour identifier chaque ligne d es
blocs recherchés

m/((?:s*!)*)/; # regexp avec smiley


mais je veux plutôt idetifier chaque bloc ( début - fin ) et son nive au
(c.à.d le nbre de '!' au début)


je pense qu'il faut adapter cette regexp mais n'y arrive pas

merci de votre aide.
Pierre.
-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/


Avatar
p_geni...
Dav' wrote:


while ( $ligne = <DATA>) {

if ( $ligne =~ m/^((?:s*!)+)/ ) {

@niveau = ( $1 =~ /!/g ) ;
print "La ligne $count est de niveau " , scalar @niveau, "n" ;

} else {

print "La ligne $count est normalen"

}

$count++

}


merci de cette réponse. Je vais l'adapter afin de détecter le début et la
fin de chaque bloc (c.à.d) changement de scalar(@niveau) et je vais tester
les performances car je vais faire cela sur des centaines de fichiers dont
certains sont de taille imposante.

Pierre.
-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/

Avatar
Dav'
Si les fichiers ne sont pas monstrueux ça vaut peut être le coup de
tester aussi les perf en faisant un slurp sur le fichier plutot que de
le lire ligne à ligne :

my @lignes = (<DATA>) ;
foreach my $ligne (@ligne) ...





Dav' wrote:


while ( $ligne = <DATA>) {

if ( $ligne =~ m/^((?:s*!)+)/ ) {

@niveau = ( $1 =~ /!/g ) ;
print "La ligne $count est de niveau " , scalar @niveau, "n" ;

} else {

print "La ligne $count est normalen"

}

$count++

}


merci de cette réponse. Je vais l'adapter afin de détecter le début et la
fin de chaque bloc (c.à.d) changement de scalar(@niveau) et je vais tes ter
les performances car je vais faire cela sur des centaines de fichiers dont
certains sont de taille imposante.

Pierre.
-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/