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 :

[regex] alternative début de ligne et autre dans recherche de chaine


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 18
    Points : 13
    Points
    13
    Par défaut [regex] alternative début de ligne et autre dans recherche de chaine
    Bonjour,
    je cherche le ou les mot(s) (0,1 ou 2) avant un mot défini contenu dans une variable. Les mots recherchés sont entre soit une virgule, soit le début de chaine ^, soit un mot clé "join" et donc la variable.

    ma regexp est donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/(\bjoin\b|^|,) (.*?) \b* $table \b/xi
    le problème et que celle ci ne matche rien alors que si je laisse la seule alternative du join (pour mon test d'execution) le mot est bien retourné.

    je ne comprends pas d'ou vient l'erreur
    merci pour votre aide

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    le \b* est fort étrange. Comment pourrait-il y avoir plusieurs limites de mots d'affilée ? Et d'ailleurs, mettre un quantificateur à une ancre, est-ce bien valide ?
    There's nothing like $HOME!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    Ta regex fonctionne quand je la teste. Il faut faire attention à récupérer le résultat dans $2 car tes premières parenthèses capturent join ou rien (début de chaine) dans $1.

    Quelques petites améliorations possibles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $chaine="join mot1 mot2 limit"; 
    my $table="limit";
     
    print "=> $1\n" if ($chaine =~ m/(?:\bjoin\b|,|^) \s* ( (?:\w+\s+){0,1} \w+) \s+ $table \b/xi);
    • Utilise des parenthèses non capturantes (?: ...) pour grouper

    • Capture un ou 2 mots en utilisant \w+ (à voir si ça convient dans ta syntaxe)


    Bonne journée

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Pour le \b* j'ai un warning qui s'affiche, mais je ne sais pas si dans le cas ou j'ai plusiers blancqs par exemple \b m'en prend qu'un ou plusieurs (sur ce que j'ai vu su la doc il me semble que ca matche tout caractère différent de a-z, 0-9 ou _.

    je ne comprend pas ca ne marche toujours pas chez moi, ni l'expression initiale, ni l'expression optimisée ...

    la chaine en entrée est : table2 TB2 INNER JOIN table1 TPS1 ON TPS1.DAT = TB2.DTCREA LEFT JOIN table3 TPS2 ON TPS2.DAT = TB2.DTSOL

    la table recherchée est : tps1

    je recherche donc le nom de la table a partir de l'alias.

    les expressions ne me retournent rien, ni en $1 ni en $2...

    si quelqu'un a une explication...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    je pense avoir trouvé d'ou vient l'erreur : la chaine en entrée est la chaine en entrée est : domaine1.table2 TB2 INNER JOIN domaine1.table1 TPS1 ON TPS1.DAT = TB2.DTCREA LEFT JOIN domaine1.table3 TPS2 ON TPS2.DAT = TB2.DTSOL

    et c'est ce '.' qui fait que ca ne renvoit rien ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Je n'arrive pas a trouver mon expression régulière qui me renverrais la plus courte chaine entre la premiere occurrence trouvée de $table et soit '\bjoin\b' soit ',' soit '^'
    est-ce que quelqu'un peut m'aider ?
    merci d'avance

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 38
    Points : 61
    Points
    61
    Par défaut
    Voila en remplaçant \w par \S. J'ai ajouté la contrainte d'avoir un espace après la table pour ne pas la confondre avec un alias.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $chaine="domaine1.table2 TB2 INNER JOIN domaine1.table1 TPS1 ON TPS1.DAT = TB2.DTCREA LEFT JOIN domaine1.table3 TPS2 ON TPS2.DAT = TB2.DTSOL"; 
    my $table="tps1";
     
    print "=>$1<=\n" if ("$chaine " =~ m/.*(?:\bjoin\b|,|^) \s* ((?:\S+\s*?)+) \s+ $table \s/xi);

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Merci !!
    j'avais pas pensé au \S !

  9. #9
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Citation Envoyé par unameno Voir le message
    Pour le \b* j'ai un warning qui s'affiche, mais je ne sais pas si dans le cas ou j'ai plusiers blancqs par exemple \b m'en prend qu'un ou plusieurs (sur ce que j'ai vu su la doc il me semble que ca matche tout caractère différent de a-z, 0-9 ou _.
    \b ne prend aucun blanc, \b est une ancre (un métacaractère qui doit vérifier une condition mais ne capture aucun caractère de la chaîne testée), l'ancre de limite de mot ("mot" au sens de suite de caractères correspondant au métacaractère \w).
    There's nothing like $HOME!

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

Discussions similaires

  1. [Batch] Remplacer une ligne par une autre dans un fichier txt
    Par tinwul dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 03/07/2009, 13h58
  2. ajout ligne avec donnée dans msflexgrid à partir d'une autre form
    Par bastos77 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/03/2009, 17h08
  3. Ecraser une ligne par une autre dans un fichier binaire
    Par lity7 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 27/04/2008, 11h47
  4. Réponses: 1
    Dernier message: 15/04/2007, 20h09
  5. Réponses: 9
    Dernier message: 22/05/2006, 12h21

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