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

C# Discussion :

Interêt et complexité des regexp


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Interêt et complexité des regexp
    Bonjour

    Chaque fois que je pense qu'un regexp pourrait etre utile. Je constate qu'il est toujours plus facile et lisible d'ecrire un bout de code et que ce sera plus rapidement fonctionnel que de chercher des heure a etudier comment le faire en regexp

    J'ai essayé de trouver des liste de modeles de regexp pur essayer d'etudier par l'exemple. Mais je n'ai rien trouvé de probant

    Je remercie cependant Stormimonn pour l'aide fréquente qu'il appote a ce sujet et je salue son erudition en la matiere

    Dans le cas présent mon besoin etait de retirer tous les caractères non numeriques d'une chaine, sauf les points-virgule

    85 secondes en C#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          StringBuilder sb = new StringBuilder();
          for (int i = 0; i < sNum.Length; i++)
          {
            if ("0123456789;".Contains(sNum[i].ToString()))
            {
              sb.Append(sNum[i]);
            }
          }
    Qui dit mieux en regexp ??

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Euh, certes! Y'a pas besoin d'une regexp pour faire "kikou"!="lol"
    Mais bon ca reste un cas d'utilisation très simple... Si tu te retrouves a tester si une chaine matche un pattern complexe tout en récuperant les differentes valeurs pour chaque section du pattern, ben bon courage

  3. #3
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Même si je suis d'accord avec PitMaverick78 sur la pas très grande utilité d'une regex dans ce cas précis, et ne parlant d'ailleurs pas le regex couramment je ne vois pas en quoi la version regex est moins bien ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    StringBuilder sb = new StringBuilder();
    foreach (Match m in Regex.Matches(sNum, "([0-9;])*"))
        sb.Append(m.Value);

    Après sans passer par les regex, et comme en ce moment je teste les possibilités de Linq on peut aussi faire comme ça (plus court, tout aussi clair, par contre j'ai pas testé la performance)

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sb.Append(sNum.Where(c => "0123456789;".Contains(c)).ToArray());
    //Et pour ceux qui aurait le Framework 4 et si la longueur du texte à vérifier le justifiait
    //sb.Append(sNum.AsParallel().Where(c => "0123456789;".Contains(c)).ToArray());

    En espérant avoir été utile (ou du moins pas trop inutile )

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Sehnsucht

    En reprenant ton modele je me dis que si le regexp oblige aussi a faire une boucle alors autant utiliser des instruction C# natives
    J'avais pensé que regexp permettait l'assignation directe d'un résultat d'une expression


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    StringBuilder sb = new StringBuilder();
    foreach (Match m in Regex.Matches(sNum, "([0-9;])*"))
        sb.Append(m.Value);
    Pour kikou
    Mais bon ca reste un cas d'utilisation très simple... Si tu te retrouves a tester si une chaine matche un pattern complexe tout en récuperant les differentes valeurs pour chaque section du pattern, ben bon courage
    Peut etre et dans le cas présent je dois encore faire un split du résultat mais ca reste élémentaire en C#

    Peut etre que regexp est tres bien quand on doit faire du parsage complexe, dans le taitement de stream a la volée ou dans un shell en unix

    Mais c'est tellement hermetique a comprendre epouvantablement mal documenté et delicat a tester qu'il me semble que si on dispose d'un language pour structurer le traitement de maniere plus explicite autant en profiter

    Cela étant le plus dommage c'est qu'il est tres dificile de trouver des explication claires simples et concise expliquant l'usage du regepxp avec des exemples simple

    La plupart des tutoriel que j'ai trouvé sont lourds, verbeux mal structuré et abordent le sujet comme si on se lançait dans l'apprentissage du sanscrit !

    J'en ai quand meme trouvé deux qui sortent du lot
    Et par chance il sont en français pourtant j'ai cherché en anglais aussi et sans préférence particuliére sinon la clarté et la concision !

    http://www-obs.univ-lyon1.fr/labo/pe...al/regexp.html

    Tiens tiens , je viens de retrouver celui-ci (ci dessous) qui est peut-etre le meilleur, mais il est malheureusement tres mal référencé, j'ai du largement aider google avec la recherche :

    les expressions regulieres développez

    On trouve alors ce bijou bien caché

    http://lgmorand.developpez.com/dotnet/regex/

    Mais j'avais déja essayé

    Tuto regexp
    memo regexp
    memento regexp
    tutoriel rexexp
    cours regexp

    NADA ! pour le tuto de Louis Guillaume qui merite pourtant le détour

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si besoin : http://stormimon.developpez.com/dotn...ns-regulieres/

    Et pour la question de départ, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string str = Regex.Replace("rg1654qgb;efb;e541654", "[^0-9;]+", string.Empty);
    Je pense que c'est plus rapide qu'avec Linq, mais la différence n'est à mon avis pas énorme. A avoir sur des données à traiter en masse.

    Par contre la méthode de Sehnsucht avec les extensions parallèles (framework 4) modifie l'ordre des caractères, ce qui est logique compte tenu du traitement parallèle, donc à éviter

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Stormimonn !

  7. #7
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    @olibara

    Salut Sehnsucht

    En reprenant ton modele je me dis que si le regexp oblige aussi a faire une boucle alors autant utiliser des instruction C# natives
    J'avais pensé que regexp permettait l'assignation directe d'un résultat d'une expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string str = Regex.Replace("rg1654qgb;efb;e541654", "[^0-9;]+", string.Empty);
    J'avais dis que je ne parlais pas le regex couramment

    @StormimOn

    Par contre la méthode de Sehnsucht avec les extensions parallèles (framework 4) modifie l'ordre des caractères, ce qui est logique compte tenu du traitement parallèle, donc à éviter
    C'est tout à fait exact, mais si l'on a besoin d'un traitement nécessitant un parallélisme (donc un traitement lourd, car sur de faibles quantités de données la version non-parallèle sera plus rapide) c'est que souvent (mais pas obligatoirement) on doit faire un gros traitement sur des données, sans forcément afficher le résultat et dans ce cas là l'ordre peut ne pas être primordial.

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par Sehnsucht
    J'avais dis que je ne parlais pas le regex couramment
    Fort heureusement ce n'est pas une tare

    Citation Envoyé par Sehnsucht
    C'est tout à fait exact, mais si l'on a besoin d'un traitement nécessitant un parallélisme (donc un traitement lourd, car sur de faibles quantités de données la version non-parallèle sera plus rapide) c'est que souvent (mais pas obligatoirement) on doit faire un gros traitement sur des données, sans forcément afficher le résultat et dans ce cas là l'ordre peut ne pas être primordial.
    Sur l'exemple du sujet c'est inapproprié mais sinon je ne pourrais pas te contredire ^^

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Je voudrais pas lancer un troll .

    Plutôt que Regex, je préfère la génération dynamique de code.

    Mais, je ne sais pas si cette technique couvre l'essentiel des cas où on est tenté de recourir à Regex.

  10. #10
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    On parle bien de CodeDom ? Car la génération dynamique de code c'est utiliser un rouleau compresseur pour écraser une mouche à ce stade je pense. Surtout que pour bien faire il est nécessaire de charger dans un AppDomain l'assembly générée dynamiquement afin de pouvoir la décharger ensuite. Sinon on se retrouve avec une ribambelles d'assembly qui se baladent à chaque compilation dynamique sans pouvoir les décharger.

    Maintenant il faudrait voir un cas concret pour pouvoir en discuter, car comme ça je ne vois pas en quoi la génération dynamique de code apporte un avantage par rapport à l'utilisation d'expressions régulières.

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    On parle bien de CodeDom ?
    Je ne connaissais pas. Mais, après un bref aperçu, ça me semble correspondre au concept (perso, j'utilise un équivalent maison).
    Sinon on se retrouve avec une ribambelles d'assembly qui se baladent à chaque compilation dynamique sans pouvoir les décharger.
    Oui, c'est bien une limitation qui peut évidemment dans certains cas s'avérer rédhibitoire.

  12. #12
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Connaissez vous Expresso? http://www.ultrapico.com/Expresso.htm
    C'est un petit utilitaire qui m'a permis de mieux apprehender les regex: son principe est simple: 3 zones pour ta regex
    -La zone de design
    -La zone des données de test
    -La zone du resultat appliqué aux données de test
    Hyper pratique!

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

Discussions similaires

  1. [VS] rechercher/remplacer avec des regexp
    Par v1nce dans le forum Visual Studio
    Réponses: 4
    Dernier message: 03/07/2007, 14h58
  2. Problème avec des regexp
    Par Petitcodeur dans le forum Langage
    Réponses: 2
    Dernier message: 17/10/2006, 10h52
  3. [Collection][List] Complexite des méthodes.
    Par marchand_de_sable dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 10/07/2006, 00h40

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