[PERL] Occurences exactes d'un caractère dans plusieurs lignes [Résolu/Fermé]

Signaler
Messages postés
37
Date d'inscription
samedi 15 décembre 2012
Statut
Membre
Dernière intervention
18 février 2016
-
Messages postés
37
Date d'inscription
samedi 15 décembre 2012
Statut
Membre
Dernière intervention
18 février 2016
-
Bonjour,

Tout d'abord, je tiens à vous informer que je suis un débutant en PERL donc ne vous inquiétez pas si les codes que je vais vous présenter ci-dessous vous paraissent assez farfelus.

Je tiens à solliciter certains d'entre vous car je sèche concernant une instruction que je dois exécuter.

Je possède un fichier d'entrée auquel je dois filtrer des lignes, contenant exactement X fois un caractère spécifique. Pour ce faire, j'utilise des Regex, ce qui est pour moi la solution la plus évidente. Cependant, je remarque que j'ai affaire à quelque chose plutôt complexe (ou sinon je me trompe ^^')

je prends l'exemple que le caractère que je veux vérifier est la lettre 'm'

j'ai beau essayer de faire des regex du genre
 /((m)+){X}/
voir même
/[m]{X}/
mais je n'obtiens pas ce que je veux car j'utilise des quantificateurs ou je veux afficher une succession de la lettre m!

Je me pose la question si avec le quantificateur
{}
qui à la base, cherche une succession de tel caractère, je peux demander à PERL qui cherche X fois le caractère demandé sans forcément être successif dans mes lignes du fichier. Je plane actuellement dessus et c'est assez dérangeant.

Merci pour votre aide gracieuse.

Cordialement.

2 réponses

Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
Salut astralangel,

Je crois que ton titre est mal libellé, car tu y dis "[PERL] Occurences exactes d'un caractère dans plusieurs lignes" alors que tu dis dans ton message "je dois filtrer des lignes, contenant exactement X fois un caractère spécifique" ce qui veux dire que tu cherches à savoir, pour chaque ligne (et non dans plusieurs lignes), si cette ligne comporte un certain nombre d'occurrences d'une lettre. Je pars donc de cette 2ème hypothèse.

A ma connaissance le quantificateur ne va quantifier que des caractères consécutifs.

Pour matcher les lignes comportant 3 lettres m, où qu'elles soient, tu peux faire, par exemple, de ces deux façons :

#!/usr/bin/perl

use strict;
use warnings;

my $st = "commentcamarche.net";

# méthode 1
if ($st =~ /^.*m.*m.*m.*$/)
{
    print("Il y a bien 3 lettres m\n");
}

# méthode 2
my $lettre = "m";
my $repetitions = 3;
my @matches = ($st =~ /$lettre/g);
if (scalar @matches == $repetitions)
{
    print("Il y a bien $repetitions lettres $lettre\n");
}


Le 2ème cas te sera utile si tu ne connais pas à l'avance la lettre à rechercher ou le nombre de répétitions. Le modificateur g permet de faire un "global matching", qui répète la recherche tant qu'il y a des données correspondantes à ta recherche. Les matches sont renvoyés sous forme d'un tableau. Il suffit d'évaluer le tableau en tant que scalaire pour savoir combien d'éléments il contient.


Dal
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
37
Date d'inscription
samedi 15 décembre 2012
Statut
Membre
Dernière intervention
18 février 2016

Bonsoir Dal,

merci beaucoup pour ta réponse! En effet, je me suis un peu mal exprimé (c'est du au fait que mon cerveau fût en ébullition, à force de chercher une solution, j'avais un peu du mal pour rédiger le topic mdr).

J'ai utilisé la première méthode que tu m'as proposé et elle fonctionne comme je le demande! J'ai opté pour celle-ci car il m'a été conseillé d'alourdir au minimum ma syntaxe.

Et je m'attendais pas à cette syntaxe là vu que j'utilisais que des quantificateurs! Comme quoi on en apprend tous les jours ^^.

Une nouvelle fois: merci beaucoup!

Astralangel.