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

Algorithmes et structures de données Discussion :

Meilleur Compréhension des Regex


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 191
    Points : 35
    Points
    35
    Par défaut Meilleur Compréhension des Regex
    Hum, suite a ce post ou pseudocode m'avait donné un solution géniales en utilisant les expressions régulières (dont je n'avais jamais encore entendu parlé).

    Je me suis penché donc plusieurs heures sur la compréhension de ces expressions, et je butes sur certains points.

    Si l'on prend l'ex de c'elle dont j'ai besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    La première chose c'est que je ne comprend trop l'histoire de cet "backreference" cad les "?:" aprés le "("

    ensuite j'ai réellement du mal a comprendre les :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (?:[a-z0-9-]*[a-z0-9])?
    dans les 2 cas ???



    Effectivement, pour le tld je ne vois pas pourquoi on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    et pas


    Quand a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
    on pourrait aussi faire plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9!#$%&'*+/=?^_`{|}~-\.]*


    Ce qui donnerai bien plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9!#$%&'*+/=?^_`{|}~-\.]+@[a-z0-9-\.]+[a-z0-9]+
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

    Merci, car la je suis un peu perdu ...

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    On a pas mal de tutoriels qui pourraient t'aider et qui abordent dans une large mesure ce dont tu as besoin : http://www.google.com/custom?q=expre...developpez.com

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Et je rajouterai aussi ce lien :
    http://www.boost.org/doc/libs/1_35_0...ex/syntax.html

    C'est un morceau de la documentation de Boost.Regex. Par contre, désolé, c'est de l'anglais

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Et bien, deux exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
    contre
    Le second n'accepte pas les tirets, alors que le premier en accepte un nombre illimité pourvu qu'ils ne commencent ni ne finissent la chaîne reconnu, autrement dit : "hello-world" est reconnu par le premier pas par le second (ce qui est une erreur), mais "-hello" ne sera pas reconnu par le premier (car il est incorrect).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
    contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [a-z0-9!#$%&'*+/=?^_`{|}~-\.]*
    le premier garantit que les points ne seront pas consécutifs, il reconnait ".hello.world.biz" mais pas "hello...world" qui est reconnu incorrectement par le second...

    Les regex à ce niveau sont un art du détail qui exige un peu plus de réflexion que tu n'en as accordé ici.

    --
    Jedaï

  5. #5
    Membre éprouvé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Points : 1 215
    Points
    1 215
    Par défaut
    Salut à tous !

    Je me permet de rentrer dans la discution car je me pose cette question : n'existe-t-il pas "d'éditeur" d'expression régulières ? Càd une sorte de formulaire ou vous cochez des ptit trucs du genre "un caractère ou plus" et ça vous renvoi l'expression recherchée...

    Mais bon je suis peut être optimiste... mais sa pourrait faire gagner pas mal de temps dans certain cas...

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je n'en connais pas et je ne suis pas sûr que cela soit utile car la manipulation à la souris est moins rapide que le clavier pour qui connait la syntaxe regex (rébarbative à souhait, je le reconnais).

    Par contre, je peux te proposer un petit utilitaire qui permet de valider les expressions régulières. D'un côté, tu entre la string, de l'autre, l'expression régulière et tu as le résultats qui s'affiche au fur et à mesure que tu modifies ton expression régulière, c'est ici : http://phoenix.servhome.org/regexbuilder_fr.php

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 191
    Points : 35
    Points
    35
    Par défaut
    > ram_0000 :
    Ton logiciel a l'air pas mal, mais il provoque une erreur a l'execution chez moi et donc ne marche pas, chez vous aussi ?

    >jedai :
    Les regex à ce niveau sont un art du détail qui exige un peu plus de réflexion que tu n'en as accordé ici.
    Il y a toujours des personnes qui ont un ton suffisant comme ca >

    Néanmoins d'aprés l'ex je crois que j'ai compris [a-z0-9-]*[a-z0-9]

    et même si d'aprés vos doc :
    A marked sub-expression is useful to lexically group part of a regular expression, but has the side-effect of spitting out an extra field in the result. As an alternative you can lexically group part of a regular expression, without generating a marked sub-expression by using (?: and ) , for example (?:ab)+ will repeat ab without splitting out any separate sub-expressions.
    Je ne comprend toujours pas se fichu Quel exemple serait validé par

    "@(?:[a-z0-9-]*[a-z0-9])?" et non pas par "@([a-z0-9-]*[a-z0-9])?" ?
    merci

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par islogged Voir le message
    Quel exemple serait validé par

    "@(?:[a-z0-9-]*[a-z0-9])?" et non pas par "@([a-z0-9-]*[a-z0-9])?" ?
    . Aucun.

    Le résultat "syntaxique" est le même. C'est juste le "formatage" du résultat qui change.

    Avec l'opérateur (?: ), le groupe ne génère pas de backref. Et c'est souvent plus rapide à calculer par l'évaluateur de regex.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/07/2006, 10h05
  2. Compréhension des exploits
    Par LordBob dans le forum C
    Réponses: 3
    Dernier message: 25/01/2006, 23h22
  3. [DEBUTANTE][ECLIPSE] Pb de compréhension des package SERVLET
    Par fchafia dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 18/02/2005, 16h55
  4. [FLASH MX] Prob de compréhension des bouttons
    Par WriteLN dans le forum Flash
    Réponses: 13
    Dernier message: 16/10/2003, 17h01
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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