OVH Cloud OVH Cloud

regexp limitée...

7 réponses
Avatar
Fabrice L.
bonjour à tous !

un petit souci pas bien méchant avec les expressions régulières. Je planche
dessus depuis quelques heures et je ne vois pas...

voila le probleme.

un t@bleau contenant :

oh mon bateau
c'est un joli bateau
bateau à voile
bateau à moteur
ne m'appelez plus jamais france
tous les bateaux
etc....


je voudrai sortir de ce tableau les lignes qui contiennent bateau

while (@tableau) { print $_ if ($_ =~ /bateau/); }

mais comment ne sortir que les lignes qui "commence" par bateau :
-> bateau à voile
-> bateau à moteur

Je dois chercher trop compliqué alors que cela doit être si simple...

Merci d'avance du coup de pouce !

Fabrice

7 réponses

Avatar
Paul GABORIT
À (at) Wed, 16 Jun 2004 13:44:31 +0200,
"Fabrice L." écrivait (wrote):
while (@tableau) { print $_ if ($_ =~ /bateau/); }


Et ça marche ?


mais comment ne sortir que les lignes qui "commence" par bateau :


foreach(@tableau){print if/^bateau/}


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Denis -esp2008-
Bonsoir,

je voudrai sortir de ce tableau les lignes qui contiennent bateau
@contient_bateau = grep /bateau/, @tableau


mais comment ne sortir que les lignes qui "commence" par bateau :
@commence_par_bateau = grep /^bateau/, @tableau


Pour en savoir plus:
perldoc -f grep

Pour en faire plus:
perldoc -f map

Bonne chance,

--
Denis

Avatar
Antoine Dinimant
sans même besoin de boucle :

my $texte = join("n", @tablo) ;
my @tablo2 = ($texte =~ m/^bateau.*$/gm) ;

un peu d'explication :

/g : ne pas s'arrêter au premier résultat, mais faire une recherche
Globale ramenant tous les résultats

/m : mode "multiligne", càd que ^ est un ancrage de début de ligne et $
un ancrage de fin de ligne. .* permet donc de capturer le reste de la
ligne (sachant que le . ne reconnaît pas le "n", sauf si tu utilises le
modificateur /s).
Avatar
Antoine Dinimant
bon, en fait la solution de Paul est meilleure... ça m'apprendra à
poster sans lire !
Avatar
Antoine Dinimant
bon, en fait la solution de Denis est meilleure... ça m'apprendra à
poster sans lire !
Avatar
Paul GABORIT
À (at) Wed, 16 Jun 2004 23:08:42 +0200,
Antoine Dinimant écrivait (wrote):
bon, en fait la solution de Paul est meilleure... ça m'apprendra à poster
sans lire !


Meilleure ? non ! La vôtre est très bien. Celle de Denis aussi. En fait, cela
illustre bien la devise de Perl : "There's more than one way to do it."

Ce qui compte c'est d'arriver à ses fins. Parfois certaines solutions semblent
plus élégantes que d'autres. Mais les goûts et les couleurs...

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Denis Joiret
Bonjour,

Bonjour,

Dans le cas présent, il n'est pas nécessaire d'utiliser les expressions
régulières :

@commence_par_bateau = grep substr($_, 0, 6) eq "bateau", @tableau;

fait le traitement demandé. Ce principe ne peut fonctionner que si on
connait l'emplacement de la chaîne soit à partir du début de ligne soit à
partir de la fin (index début négatif dans ce cas), mais s'avère en moyenne
plus performant que l'utilisation d'expressions régulières (le temps de
traitement est constant, alors que le temps de traitement avec une
expression régulière dépend des données qu'on traite).

Denis

"Fabrice L." a écrit dans le message de
news:capbha$pkk$
bonjour à tous !

un petit souci pas bien méchant avec les expressions régulières. Je
planche

dessus depuis quelques heures et je ne vois pas...

voila le probleme.

un contenant :

oh mon bateau
c'est un joli bateau
bateau à voile
bateau à moteur
ne m'appelez plus jamais france
tous les bateaux
etc....


je voudrai sortir de ce tableau les lignes qui contiennent bateau

while (@tableau) { print $_ if ($_ =~ /bateau/); }

mais comment ne sortir que les lignes qui "commence" par bateau :
-> bateau à voile
-> bateau à moteur

Je dois chercher trop compliqué alors que cela doit être si simple...

Merci d'avance du coup de pouce !

Fabrice