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 :

[langage] [RegExp] Question d'expression régulière


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 19
    Points : 13
    Points
    13
    Par défaut [langage] [RegExp] Question d'expression régulière
    Bonjour,
    je débute en expression régulière et je souhaiterais savoir comment "matcher" une chaine qui contient tout sauf * suivit de *

    Merci pour vos réponses

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    use strict;
     
    my $ChaineInitiale = "tototititata*";
    my $ChaineTrouvee = "";
     
    if ($ChaineInitiale =~ /^(.[^*]*)\*/) {
        $ChaineTrouvee = $1;
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    : Pourrais tu m'expliquer ton expression s'il te plait Je l'a comprend pas très bien.
    Je ré-explique un peu:

    "fksdj*kfdskf*fsdfjdsklf" est "matché"
    "sqdfqsdfq" aussi
    mais pas "dsfqdfjqsj**jhfdqjf"

    Merci à tous !

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Désolé pour hier et pour l'explication, je t'ai répondu à la va-vite car je me cassais du taf

    En reprenant ma RegExp :
    if ($ChaineInitiale =~ /^(.[^*]*)\*/)

    ^ -> recherche effectuée dès le début de la chaîne
    (.[^*]*) -> recherche avec mémorisation (les parenthèses) d'un ou plusieurs caractères (ou zéro si non trouvé) n'étant pas un astérisque
    \* -> suivi d'un astérisque (ici, on est obligé de mettre \ devant * car dans une regexp, * signifie "0 ou plusieurs caractères", or on recherche ici le caractère * en tant que tel)

    C'est pas évident mais si on analyse mon blabla par une phrase, la regexp pourrait être ceci : recherche dès le début de la chaîne toute suite éventuelle de caractères n'étant pas *, suivie justement du caractère *. La chaîne trouvée (si trouvée) avant * est mémorisée et stockée dans la variable $1.

    Je ne suis pas un pro des expressions régulières et celle-ci d'ailleurs n'est pas capable de matcher des chaînes du genre "toto*titi*tata*truc*pouet***titi".

    Mais bon ...

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Je suis pas trop d'accord:
    je redefini le pattern :
    n'importe quoi different de * suivit de *, ce qui donne :
    [^*] permet de matcher un caractere different de * ([] permet de definir un ensemble de caractere ([1A-Z] = {1,A,B,...Z}, et le ^ permet d'inverser la selection)
    [^*]* permet de "compter" les caracteres de l'ensemble, on en autorise autant que l'on veut (0->+inf), s'il en faut au moins un, il faut mettre + ([^*]+)
    [^*]*\* signifie enfin l'ensemble precedent suivit du caractere * (il est protege par \, car sinon c'est l'expression precedente valable de 0 a +inf de fois)

    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($string =~ /[^*]*\*/) {
        print STDERR " J'ai trouve le pattern : n'importe quoi different de * suivit de *\n"
    }
    Maintenant, en lisant tes exemples (notamment le coups des deux etoiles), ce que tu as dis n'est pas ce que tu recherche.

    Je crois que ce que tu cherche est :
    la chaine doit etre composee entierement du motif suivant : n'importe quoi different de * et non vide, suivit de *
    Ce qui nous donne le pattern suivant,
    [^*]+\* : n'importe quoi different de * et non vide suivit de *
    il reste a voir si toute la chaine est constitue de ce motif, c'est-a-dire si ce motif peut-etre reperte (au moins 1 fois) du debut jusqu'a la fin:
    ^([^*]+\*)+$ : ^ permet de fixer le pattern au debut de la chaine, et $ a la fin, les parentheses servant a grouper le motif pour le + (et accessoirement a memoriser les motifs trouves).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($chaine =~ /^([^*]+\*)+$/) {
        print STDERR "pattern valide\n";
    }
    [edit]Quoique dans ce cas, le premier exemple n'est pas valable. Specifie correctement ce que tu veux matcher. Plus c'est clair dans ta tete, plus c'est simple a ecrire[/edit]

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Merci à tous pour vos explications ! je m'en suis sorti ... 8)

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

Discussions similaires

  1. [REGEXP] Question Utilisation fonction replace
    Par calitom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/03/2007, 17h39
  2. [langage]question expression reguliere
    Par Fabouney dans le forum Langage
    Réponses: 13
    Dernier message: 27/06/2005, 01h48
  3. [langage] [RegExp] Détecter un chemin Windows
    Par GLDavid dans le forum Langage
    Réponses: 3
    Dernier message: 01/09/2004, 14h57
  4. [langage] [RegExp] Récupérer une portion de phrase
    Par GLDavid dans le forum Langage
    Réponses: 4
    Dernier message: 27/08/2004, 22h01
  5. [langage] simple question ...
    Par perlgirl dans le forum Langage
    Réponses: 13
    Dernier message: 16/07/2004, 13h22

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