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

Expression régulière pour "éclater" (split) une chaîne


Sujet :

Langage Delphi

  1. #21
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    @SergioMaster,CosmoKnacki,Barbibulle

    Me permettriez-vous de reprendre tels quels les exemples de cette discussion pour un article sur les expressions régulières ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #22
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut


    Excellente idée.

  3. #23
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Sans problème.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #24
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    J'allais le suggérer , c'est sujet à au moins une FAQ
    par contre il faudrait aussi étudier le cas où l'on peut utiliser le Split (un fichier CSV par exemple?)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #25
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Meri pour vos réponses.

    Citation Envoyé par SergioMaster Voir le message
    c'est sujet à au moins une FAQ
    Bonne idée. Il faudrait commencer par regarder ce qu'il y a déjà dans la FAQ, sur les expressions régulières.

    Citation Envoyé par SergioMaster Voir le message
    il faudrait aussi étudier le cas où l'on peut utiliser le Split (un fichier CSV par exemple?)
    Pour la function Split, j'ai complété l'exemple que j'avais déjà posté plus haut dans cette discussion. Il me semble qu'il suffit à faire le tour de la question. Mais il serait intéressant en effet de montrer l'application de cette technique à un fichier CSV.

    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
     
    uses
      RegularExpressions,
      SysUtils;
     
    var
      a: TArray<string>;
      s: string;
      i: integer;
     
    begin
      a := TRegEx.Split(GetEnvironmentVariable('PATH'), ';');
     
      for s in a do
        WriteLn(s);
     
      a := TRegEx.Split('xxx xxx,xxx-xxx', '[ ,-]');
     
      //for s in a do
      //  WriteLn(s);
      for i := 0 to High(a) do
        WriteLn(a[i]);
     
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #26
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    J'ai découvert qu'on pouvait changer la façon dont les groupes sont comptés, et obtenir un résultat que je trouve plus naturel. C'est un peu difficile à expliquer mais en regardant l'exemple vous allez comprendre tout de suite :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    program Alternative5;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils, RegularExpressions;
     
    const
      SAMPLE: array[0..10] of string = (
        '*ABORG-001360',
        '?CASTELO 1419-002370',
        '*EX/MINOU1424-412380',
        '*RUBAN-003001',
        '1234578011230',
        '3760162052329',
        '1456441001360',
        'AAAAAAA',
        '*AAAAA-001',
        '*AAAAAA001360',
        '123121212'
      );
     
    {$DEFINE USE_BRANCH_RESET_GROUP}
     
    const
      PATTERN1 = '^[*?]([^-]{1,15})-(\d{3})(\d{3})$';
      PATTERN2 = '^(123\d{10})$';
      PATTERN3 = '^(\d{13})$';
    {$IFNDEF }
      PATTERN = PATTERN1 + '|' + PATTERN2 + '|' + PATTERN3;
    {$ELSE}
      PATTERN = '(?|' + PATTERN1 + '|' + PATTERN2 + '|' + PATTERN3 + ')';
      (* http://www.regular-expressions.info/refadv.html *)
    {$ENDIF}
     
    var
      g: TGroup;
      e: TRegEx;
      m: TMatch;
      i: integer;
     
    begin
      e := TRegEx.Create(PATTERN);
     
      for i := Low(SAMPLE) to High(SAMPLE) do
      begin
        m := e.Match(SAMPLE[i]);
        if m.Success then
        begin
          Write(i, ' ', m.Groups.Count);
          for g in m.Groups do
            Write(' "', g.Value, '"');
          WriteLn;
        end;
      end;
     
      ReadLn;
    end.
    Résultat sans l'option "reset" :

    0 4 "*ABORG-001360" "ABORG" "001" "360"
    1 4 "?CASTELO 1419-002370" "CASTELO 1419" "002" "370"
    2 4 "*EX/MINOU1424-412380" "EX/MINOU1424" "412" "380"
    3 4 "*RUBAN-003001" "RUBAN" "003" "001"
    4 5 "1234578011230" "" "" "" "1234578011230"
    5 6 "3760162052329" "" "" "" "" "3760162052329"
    6 6 "1456441001360" "" "" "" "" "1456441001360"
    Avec l'option "reset" :

    0 4 "*ABORG-001360" "ABORG" "001" "360"
    1 4 "?CASTELO 1419-002370" "CASTELO 1419" "002" "370"
    2 4 "*EX/MINOU1424-412380" "EX/MINOU1424" "412" "380"
    3 4 "*RUBAN-003001" "RUBAN" "003" "001"
    4 2 "1234578011230" "1234578011230"
    5 2 "3760162052329" "3760162052329"
    6 2 "1456441001360" "1456441001360"
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #27
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Effectivement si tu n'as pas deux formats nécessitant le même nombre de groupes le "branch reset" peut être une bonne option pour identifier le format utilisé (et ne pas générer de captures vides).

    Trucs rigolos avec les branch reset et les captures nommées:
    • les noms des captures se transmettent d'une branche à l'autre (quelque soit la branche dans laquelle le nom a été donné), par exemple avec (?|(?<jour>[0-9]{2})/([0-9]{2})|([0-9]{2})\.(?<mois>[0-9]{2})) on peut retrouver les captures en utilisant les noms quelque soit la branche empruntée.
    • on peut définir plusieurs groupes de capture avec le même nom dans différentes branches (par défaut utiliser plusieurs fois le même noms pour un groupe est interdit). Il faut toutefois que les groupes avec le même nom soit à la même place (avec le même numéro) dans chaque branche.
      Pour pouvoir par exemple intervertir la position de deux groupes nommés, on peut utiliser le modificateur (?J) pour autoriser les noms dupliqués et un groupe non-capturant: (?J)(?:(?<jour>[0-9]{2})/(?<mois>[0-9]{2})|(<mois>[0-9]{2})\.(?<jour>[0-9]{2})) mais dans ce cas magie du branch reset a disparue car si la deuxième branche réussie, les deux groupes de la branche précédente sont créés et débaptisés pour n'avoir que les numéros 1 et 2.(les noms sont données aux vainqueurs, les groupes 3 et 4)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/11/2008, 22h00
  2. Expression régulière pour récupérer une chaîne.
    Par z980x dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 24/06/2007, 16h01
  3. Réponses: 22
    Dernier message: 18/07/2006, 16h05

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