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

VB.NET Discussion :

Regex qui tourne en rond


Sujet :

VB.NET

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Regex qui tourne en rond


    Je reviens à la charge avec les Regex. Je travailles sur un interpréteur de formules, à chaque réduction d'une partie des équations, on enlève les parenthèses en trop, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim rgx_const_parenthesee As New Regex("((\()([0-9,]+)+(\)))") ' regex pour trouver des nombres décimaux entre aprenthèses (avec groupage des parenthèses et du nombre)
     
    For Each match As Match In rgx_const_parenthesee.Matches(res) 'on enlève les parenthèses inutiles autours de certaines opérations résolues qui bloquent le porcessus : ex (((1+2)))+1 donnerait (3)+1. Le programme pense qu'il y a une sous opération à gauche du plus et ne fait pas 3+1.
        Dim s As String = match.Value
        s = s.Replace("(", "")
        s = s.Replace(")", "")
        res = res.Replace(match.Value, s) 'pour l'exemple (((1+2)))+1 on a (3)+1, la regex trouve (3) et met cette string dans s, on enlève les parenthèses, et on remplace (3) par 3 
    Next
    Elle fonctionne bien sauf à la fin avec ce type de chaîne:
    (0,0045492502083257919268042437+1,0882259561075000389088239696)
    Le matching ne rend plus la main, ça tourne sans fin à priori sans même entrer dans la boucle. Je ne vois pas trop pourquoi.
    Pour information, à ce stade là, la regex ne doit plus trouver de parenthèse à enlever avant le calcul final.


    pour votre aide


    [Edit]
    A l'avant-dernier tour la regex matche bien cette chaîne:
    ((0,0045492502083257919268042437)+(1,0882259561075000389088239696))
    mais c'est la dernière fois qu'elle tourne correctement
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    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 : 40
    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
    C'est pas génial de parcourir les match pour ensuite faire des replace alors que Regex dispose déjà d'une méthode Replace remplaçant tous les motifs correspondant par la chaine donnée (ou exécutant l'action demandée si on utilise la surcharge attendant un MatchEvaluator)

    A priori ceci fonctionne au vu des éléments donnés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim rgx = New Regex("\(\s*(\d(?:,\d+)?)\s*\)")
     
    Dim sample = "(((0,0045492502083257919268042437))+(1,0882259561075000389088239696))"
     
     
    Dim tmp = rgx.Replace(sample, "$1")
     
     
    Do Until tmp = sample
        sample = tmp
        tmp = rgx.Replace(sample, "$1")
    Loop
    Basiquement on boucle tant qu'on peut remplacer le motif.

    En ce qui concerne l'expression rationnelle en elle-même :

    • \( -> parenthèse ouvrante
    • \s* -> de 0 à une infinité d'espaces (sens large : tabulation etc.)
    • (\d(?:,\d+)?) -> groupe 1
      • \d -> un chiffre
      • (?:,\d+)? -> groupe non capturant optionnel
        • , -> la virgule
        • \d+ -> au moins un chiffre

    • \s* -> de 0 à une infinité d'espaces (sens large : tabulation etc.)
    • \) -> parenthèse fermante


    Et on remplace l'intégralité du match par $1 c'est à dire par le contenu du groupe 1 ; ainsi on passe de (nombre) à juste nombre
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Merci beaucoup pour ton aide, j'y vois plus clair désormais (j'ai aussi réussi à récupérer un bouquin sur les regex pour m'améliorer dans ce domaine) et merci pour les explications de la regex
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Dataset qui tourne en rond
    Par BMT_Benoît dans le forum Windows Forms
    Réponses: 10
    Dernier message: 08/09/2007, 23h36
  2. Paramètres GET & fonction qui tourne en rond
    Par bigltnt dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2007, 11h06
  3. Requete qui tourne en rond
    Par hugo69 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/11/2005, 20h02
  4. Prog qui tourne en rond :-(
    Par FranckDev dans le forum CORBA
    Réponses: 2
    Dernier message: 07/09/2005, 13h50

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