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 PHP Discussion :

pourquoi cette difference [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut pourquoi cette difference
    Bonjour,

    pouvez-vous m'aider à résoudre ce mistère :

    j'ai ce texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._I26_B_Gnd
    float	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._O0_S_StbColCmd.R_CAntiPioPitUp
    float	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._O0_S_StbColCmd.R_CIntRcntr
    je voudrais matcher la deuxième ligne grace à cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #(?:\*?\w+[_.])*\*?StbColCmdB[_.]\*?\w*S_StbColCmd[_.]\*?\w*R_CAntiPioPitUp#
    Comme ça ne marche pas j'ai essayer plusieur choses et ça, ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #(?:[*\w.])*\*?(\w*)StbColCmdB[_.]\*?\w*S_StbColCmd[_.]\*?\w*R_CAntiPioPitUp#
    Que la deuxième regex marche ne me perturbe pas mais la première devrais marcher tout aussi bien (à mes yeux)...

    Merci d'avence pour vos lumières.

    ++Florent.

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Pouurais-tu expliciter en français ce que dois reconnaître la regex ?

  3. #3
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut
    Oui bien sur :

    j'ai une liste de nom de variable du type toto.tata.titi.tutu
    ma regex doit retrouver les lignes ou l'on trouve tata._bidule_titi._truv_tutu
    Où _truc_ et _bidile_ peuvent être présent ou non...

    Ma question porte essencillement sur le début de la regex qui mange tout le début de la variable.

    ++Florent.

  4. #4
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    Bah tes 2 regex (déjà sont affreuses désolé mais j'ai mal au crâne rien qu'à les regarder lol)
    et de 2 n'expriment pas la même chose...
    Mais chez moi aussi bien la 2 que la 1 capturent bien la 2eme chaine...

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    J'avoue ne pas trop comprendre le but, mais que penses-tu de celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reg = '#(?:\*?[\w_.]+)\*?StbColCmdB[_.]\*?\w*S_StbColCmd[_.]\*?\w*R_CAntiPioPitUp#';

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par floanne Voir le message
    j'ai une liste de nom de variable du type toto.tata.titi.tutu
    ma regex doit retrouver les lignes ou l'on trouve tata._bidule_titi._truv_tutu
    Où _truc_ et _bidile_ peuvent être présent ou non...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <pre>
    <?php
     
    $data =<<< EO_DATA
    int	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._I26_B_Gnd
    float	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._O0_S_StbColCmd.R_CAntiPioPitUp
    float	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._O0_S_StbColCmd.R_CIntRcntr
     
    float	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._O0_S_StbColCmd.S_StbColCmd
    float	_C_._C_1_Afcs2._C_2_AfcsB2._C_2_AfcsFctB2._C_5_AfcsNomB2._C_9_RtmSchNomB2._C_2_RtmSchNomFctB._C_1_StbB._C_1_StbColB._C_1_StbColCmdB._O0_R_CAntiPioPitUp.S_StbColCmd
    EO_DATA;
     
    // lignes contenant les 3 éléments dans l'odre précis
    $regex = '#^.*?StbColCmdB.*?S_StbColCmd.*?R_CAntiPioPitUp.*?$#m';
    preg_match_all($regex, $data, $les_3_ordre_precis, PREG_SET_ORDER);
    print_r($les_3_ordre_precis);
     
    // lignes contenant les 3 éléments dans n'importe quel ordre
    $elements = implode('|', array('StbColCmdB','S_StbColCmd','R_CAntiPioPitUp'));
    $regex = sprintf('#^.*?(%s).*?((?!\1)(?1)).*?((?!\1|\2)(?1)).*?$#m', $elements);
    preg_match_all($regex, $data, $les_3_tout_ordre, PREG_SET_ORDER);
    print_r($les_3_tout_ordre);
     
    ?>
    </pre>

  7. #7
    Membre confirmé Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut
    Merci pour vos réponses.

    Mon problème n'en ai pas vraiment un, je voudrais juste comprendre pourquoi la regex 1 ne marche pas chez moi, car pour moi les deux devraient matcher la même chose.

    ++Florent.

    PS j'ai testé mes reg ex ici

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par floanne Voir le message
    je voudrais juste comprendre pourquoi la regex 1 ne marche pas chez moi
    J'ai pas regardé tes expressions régulières en profondeur, mais la seconde est totalement linéaire, donc aucun récursion possible. Alors que la première ressemble au cas d'école:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
     
    preg_match('/.X(.+)*X/','bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', $match);
    print_r($match);
     
    ?>
    Qui est une récursive même s'il y a absence de (?R). Le succès/échec sera dépendant de la taille du stack de récursion déterminée à la compilation de PCRE et de la complexité de la chaine source. L'échec dans les cas de récursives est souvant dû au stack overflow. Normalement avec la limite par défaut, la chaine 'bbbbXcXaaaaaaaaaaaa' devrait passer dans cet exemple.

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

Discussions similaires

  1. Pourquoi cette requête SQL ne marche pas toujours
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 14/12/2006, 18h29
  2. Réponses: 1
    Dernier message: 18/08/2006, 17h49
  3. [C#]Pourquoi cette erreur à la suppression d'un repertoire ?
    Par prince_antonio dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/07/2006, 18h47
  4. Pourquoi cette requête est lente ?
    Par zenzo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2006, 16h15
  5. [BCB5][FB1.5]Pourquoi cette commande ne fonctionne pas ?
    Par Sitting Bull dans le forum Débuter
    Réponses: 1
    Dernier message: 17/11/2004, 17h27

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