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

Delphi Discussion :

Utilisation des RegEx


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation des RegEx
    Bonjour,

    je dispose d'une chaine aléatoire de 8 chiffres. J'aimerais en la lisant de gauche à droite, repérer la première séquence consécutive ou non de 3 chiffres pouvant constituer un angle entier (0-360°) non multiple de 30. (Un "021" par exemple est accepté).

    La regEx que j'utilise est la suivante : '([3])[6-9]*([0-5][0-9])|([0-2][0-9]{2})'

    Le code :
    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
    // uses System.RegularExpressions;
    procedure TForm1.Button3Click(Sender: TObject);
    const
      randomstring = '98396248';                             //Résultat attendu : 324
      regexstring = '([3])[6-9]*([0-5][0-9])|([0-2][0-9]{2})';
    var
      regex: TRegEx;
      match: TMatchCollection;
      groupe: TGroupCollection;
      i, j: Integer;
      stmp: string;
    begin
      regex := TRegEx.Create(regexstring);
      match := regex.Matches(randomstring);
      if match.Count > 0 then
      begin
        i := 0; // Le premier résultat
        groupe := match.Item[i].Groups;
        stmp := '';
        { 3 groupes : 0 Full, 1 : Grp 1, 2 : Grp 2 }
        for j := 1 to groupe.Count - 1 do
          stmp := stmp + groupe.Item[j].Value;
        stmp := randomstring + '->' + stmp;
        Memo1.Lines.Add(stmp)
      end;
    end;
    Cela fonctionne et je traite ensuite le résultat de la regEx par un filtre avec un modulo. Comme je cherche toujours à élargir un peu mes connaissances, je me demandais si on pouvait de manière élégante exclure les multiples de 30 dans la regEx elle-même.

    Merci. Cordialement. Gilles

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne sais pas si il est possible avec un regex de ne pas tenir compte des multiples de 30.

    Par contre, tu n'a pas besoin des premiers crochets tu peux juste mettre (3).

    Dans le traitement que l'on voit, tu prends en compte les multiple de 30. Il doit manquer une partie non ?

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Élégante, je n'irais pas jusque là, mais au moins en utilisant des branch reset (?|..(..)..|..(..)..) tu peux obtenir un groupe pour chaque chiffre quelque soient les branches utilisées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (?|
        (0) \d*? (?| ([0124578]) (\d) | ([369]) \d*? ([1-9]) )
      |
        (1) \d*? (?| ([0134679]) (\d) | ([258]) \d*? ([1-9]) )
      |
        (2) \d*? (?| ([0235689]) (\d) | ([147]) \d*? ([1-9]) )
      |
        (3) \d*? (?| ([1245]) (\d) | ([03]) \d*? ([1-9]) )
    )
    Donc malgré les 20 groupes de capture présents dans la pattern, il n'y en a en réalité que 3.

    demo

    Si tu veux conserver l'indentation de la pattern, tu dois utiliser l'option roIgnorePatternSpace ou commencer la pattern par (?x), sinon retire tous les espaces et sauts des lignes.

Discussions similaires

  1. Probleme d'utilisation des Regex
    Par krisox dans le forum C#
    Réponses: 6
    Dernier message: 03/05/2010, 19h30
  2. Utilisation des Regex avec Boost
    Par Inarius dans le forum Boost
    Réponses: 1
    Dernier message: 20/01/2010, 13h47
  3. [tcprewrite] utilisation des regex
    Par dahtah dans le forum Réseau
    Réponses: 0
    Dernier message: 01/10/2008, 13h12
  4. [RegEx] Utilisation des regex
    Par djus29 dans le forum Langage
    Réponses: 7
    Dernier message: 21/05/2008, 17h43

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