IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

RegExp - Ne pas matcher si


Sujet :

Langage Perl

  1. #1
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut RegExp - Ne pas matcher si
    Bonjour à tous,

    J'écris un parseur de fichiers (ou depuis STDIN) PHP afin d'y extraire les fonctions utilisées pour enfin vérifier qu'elles ne sont pas obsolètes.
    Donc le script est fonctionnel à ceci près qu'il matche toutes les fonctions, même celles définies par l'utilisateur (du coup pas moyen de vérifier en ligne si elles sont obsolètes...).
    De plus je ne souhaite pas matcher les fonctions d'une classe tel que $this->function ou (...)->fonction.

    Voici la regexp qui trouve toutes les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $regexp   = '([\w]{4,})[\s]{0,}\(.*\)';
    Dans un premier temps pour ne pas sélectionner les fonctions d'une classe, j'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $regexp   = '((?!>)[\w]{4,})[\s]{0,}\(.*\)';
    Alors je crois bien ne pas avoir bien saisi le fonctionnement de (?!), pourtant j'ai bien lu http://search.cpan.org/~rgarcia/perl-5.9.4/pod/perlretut.pod

    J'ai réussi en trichant un peu, je matche ausi les signes - et > puis je procède à une 2ème vérification, càd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my ($ff) = $_ =~ m/$regexp/i;
    if ( defined $ff && $ff !~ m/>/ ) {
    (...)
    }
    Idem il faudrait que je ne matche pas quand la fonction est précédée de "function ".

    Y a-t-il une solution en une seule regexp ?
    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En fait, je crois que tu t'es simplement trompé de "zero-width assertion" : au lieu de la look-ahead, il fallait sélectionner la look-behind (une fonction qui ne suit pas >) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $regexp   = '(?<!>)([\w]{4,})[\s]{0,}\(.*\)';
    ce qui forme un joli dessin : <!>

    (j'ai aussi déplacé la parenthèse capturante, puisque l'assertion n'a pas lieu d'être capturée (et est de toute manière de taille zéro) ; il n'est cependant pas erroné d'incorporer l'assertion dans la capture, apriori).

  3. #3
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut
    Oui j'ai essayé cette forme, mais le résultat n'est pas le bon, il m'enlève le premier caractère.
    Pour cette fonction : $this->GetMessage() il me retourne etMessage.

    J'ai triché en matchant toutes les formes de fonction possibles :

    • function funct()
    • new func()
    • $this->func()
    • $self::funct()
    • funct()

    À l'aide de my $regexp = '((function |new |)[:\->\w]{4,})[\s]{0,}\(';.

    Ensuite je fais le ménage tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ( $func =~ m/(^(function|new) |:|>)/ ) {
        # Discard function func_name() and new func_name()
        my (undef, $f) = split / /, $func;
        # Discard $this->func_name()
           (undef, $f) = split />/, $func if ! defined $f;
        # Discard $self::func_name()
           (undef, $f) = split /:/, $func if ! defined $f;
        $func = $f;
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En fait, il suffit d'introduire un autre "zero-width assertion" : \b (word boundary) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $regexp   = qr/(?<!>)\b([\w]{4,})[\s]{0,}\(.*\)/;
    J'en profite aussi pour utiliser l'opérateur qr de compilation de regexp.

  5. #5
    Membre régulier Avatar de Tiger-222
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 76
    Points : 106
    Points
    106
    Par défaut
    Bien vu, merci Philou.

    Voici le script pour ceux que ça intéresserait : php-deprecated.pl

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Regexp Pattern et Matcher
    Par Space23 dans le forum Général Java
    Réponses: 3
    Dernier message: 23/09/2011, 00h08
  2. [RegEx] Regexp avec un mot à ne pas matcher
    Par m0ul3sh0t dans le forum Langage
    Réponses: 12
    Dernier message: 20/11/2009, 14h03
  3. REGEXP ne pas selectionner la chaine recherche
    Par pimpmyride dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/05/2007, 14h19
  4. [regExp] passe en php mais pas javascript seulement sous ie
    Par zax-tfh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/09/2005, 14h34
  5. Regexp ok sur IE pas sur Firefox
    Par zebuman dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/06/2005, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo