[PERL] Occurences exactes d'un caractère dans plusieurs lignes

Résolu/Fermé
astralangel Messages postés 37 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 18 février 2016 - 8 janv. 2014 à 16:54
astralangel Messages postés 37 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 18 février 2016 - 8 janv. 2014 à 21:03
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.
A voir également:

2 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 8/01/2014 à 17:59
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
astralangel Messages postés 37 Date d'inscription samedi 15 décembre 2012 Statut Membre Dernière intervention 18 février 2016
8 janv. 2014 à 21:03
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.
0