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 :

Regex avec TPerlRegEx


Sujet :

Langage Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Regex avec TPerlRegEx
    Bonjour,

    J'ai un problème avec une regex, dans une appli que j'ai en Delphi 7. J'utilise la librairie TPerlRegEx.
    Ce n'est pas vraiment un problème lié à delphi, mais plus à l'utilisation d'expression régulière.
    Je ne sais pas si je poste au bon endroit.

    Voici mon problème.

    j'ai des chaines de caractère du style : ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER.

    Je souhaiterais découper ces chaines sur la combinaison \+. Je dois donc récupérer les chaines suivantes :
    • ADFBH:CF+KLJHD34-kjh
    • ASGFD
    • DFGD:SDFSDF-ZER


    J'utilise la fonction suivante :


    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
    procedure TForm1.btn5Click(Sender: TObject);
    var regx: TPerlRegEx;
    begin
      lst1.Clear;
     
      regx := TPerlRegEx.Create;
      regx.Subject := edt2.Text;
    //  regx.RegEx := '([^\?]+[^\+])([\?][\+])?';
    //  regx.RegEx := '([^\+]*)(?:[\+])?';
      regx.RegEx := '([^\+]*)(?:[\+]?)';
    //  regx.RegEx := '([^\?][^\+])(?:\\\+)?';
     
      if (regx.Match) then
        repeat
          lst1.Items.Add(regx.MatchedText);
        until not regx.MatchAgain;
     
      FreeAndNil(regx);
    end;

    Je pensais utiliser la regex suivante ([^\+]*)(?:[\+]?).
    Mais, cela ne fonctionne pas correctement, j'obtiens:
    • ADFBH:CF+
    • KLJHD34-kjh\+
    • ASGFD\+
    • DFGD:SDFSDF-ZER


    Savez-vous comment corriger mon traitement ?
    Dernière modification par Andnotor ; 01/11/2018 à 09h42. Motif: Balise [code]

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Voici un exemple: J'ai remplacé CODE par CADE parce que code est une balise ici
    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
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
     st1 : string ;
     sl1,sl2 : TSTringList ;
    begin
      st1 := '[CADE]ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER[\CADE]' ;
      st1 := StringReplace(st1,'[CADE]','',[]) ;
      st1 := StringReplace(st1,'[\CADE]','',[])  ;
      st1 := StringReplace(st1,'\+',#255,[rfReplaceAll]) ;
      sl1 := TSTringList.Create ;
      sl1.Delimiter := #255 ;
      sl1.DelimitedText := st1 ;
      ListBox1.Items.Text := sl1.Text ;
      sl1.Free ;
    end;

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    (.*)\x5C\x2B(.*)\x5C\x2B(.*)?


    Nom : 2018-11-02_105219.jpg
Affichages : 567
Taille : 109,4 Ko

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Papy214 Voir le message
    (.*)\x5C\x2B(.*)\x5C\x2B(.*)?
    merci Expresso
    il manque peut-être les marquages de début et fin de chaine, ce qui m'inquiète plus est qu'il s'agisse de la librairie TPerlRegEx
    il y aura peut être un problème de syntaxe d'expression à vérifier !
    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. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    https://regex101.com/ semble donner le même résultat

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Une solution qui fonctionne.

    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
    { http://lists.freepascal.org/fpc-pascal/2007-November/015779.html }
     
    uses
      pcre;
     
    {$ASSERTIONS ON}
     
    var
      aiguille, foin: ansistring;
      re: IRegex;
      mt: IMatch;
      i: longint;
    begin
      aiguille := '\\\+';
      foin := 'ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER';
      re := RegexCreate(aiguille);
      i := 0;
      mt := re.Match(foin, i);
      if mt.Success then
      begin
        repeat
          Assert(mt.Value = '\+');
          WriteLn(Copy(foin, Succ(i), mt.Groups[0].Index - i));
          i := mt.Groups[0].Index + mt.Groups[0].Length;
          mt := re.Match(foin, i);
        until not mt.Success;
        if i < Length(foin) then
          WriteLn(Copy(foin, Succ(i)));
      end;
    end.
    P.-S. Zut, je m'aperçois que je n'ai pas utilisé la bonne bibliothèque.

    Voilà, c'est mieux comme ça.

    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
    uses
      SysUtils,
    {$if compilerversion >= 22.0}
      RegularExpressionsCore;
    {$else}
      PerlRegEx; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *)
    {$ifend}
     
    var
      re: TPerlRegEx;
      i: integer;
    begin
      re := TPerlRegEx.Create;
      re.Subject := 'ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER';
      re.RegEx := '\\\+';
      i := 1;
      if re.Match then
      begin
        repeat
          WriteLn(Copy(re.Subject, i, re.MatchedOffset - i));
          i := re.MatchedOffset + re.MatchedLength;
        until not re.MatchAgain;
        if i <= Length(re.Subject) then
          WriteLn(Copy(re.Subject, i));
      end;
      re.Free;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    (.*)\x5C\x2B(.*)\x5C\x2B(.*)
    Oui, si on suppose qu'il y a toujours deux séparateurs. J'ai raisonné comme si le nombre de séparateurs était variable.

    Effectivement ça fonctionne.

    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
    uses
      SysUtils,
    {$if compilerversion >= 22.0}
      System.RegularExpressionsConsts,
      System.RegularExpressionsCore;
    {$else}
      PerlRegEx;
    {$ifend}
     
    var
      pre: TPerlRegEx;
      i: integer;
     
    begin
      pre := TPerlRegEx.Create;
      pre.RegEx := '(.+)\\\+(.+)\\\+(.+)';
      pre.Subject := 'ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER';
     
      if pre.Match then
        for i := 0 to pre.GroupCount do
          WriteLn('  (', i, ') ', pre.Groups[i]);
     
      pre.Free;
    end.
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      (0) ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER
      (1) ADFBH:CF+KLJHD34-kjh
      (2) ASGFD
      (3) DFGD:SDFSDF-ZER
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Une variante, avec la méthode Split.

    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
    var
      re: TPerlRegex;
      sl: TStrings;
     
    begin
      re := TPerlRegex.Create;
      re.Subject := 'ADFBH:CF+KLJHD34-kjh\+ASGFD\+DFGD:SDFSDF-ZER';
      re.RegEx := '\\\+';
      sl := TStringList.Create;
      re.Split(sl, 0);  // Le deuxième paramètre est le nombre maximum d'éléments. Zéro veut dire pas de limite.
      re.Free;
      WriteLn(sl.Text);
      sl.Free;
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup de vos réponses.
    En fait, le nombre de séparateurs est variable. Je ne l'avais pas précisé.

    Je me suis passé des regex pour résoudre ce problème.
    Je cherchais pas contre comment le faire avec une expression régulière.

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par benoit1024 Voir le message
    Merci beaucoup de vos réponses.
    En fait, le nombre de séparateurs est variable. Je ne l'avais pas précisé.

    Je me suis passé des regex pour résoudre ce problème.
    Je cherchais pas contre comment le faire avec une expression régulière.

    Alors la méthode Split indiquée juste au-dessus conviendra très bien

  11. #11
    Invité
    Invité(e)
    Par défaut
    Comme je l'ai dit, le problème n'est plus de résoudre ce problème avec Delphi, c'est comment faire avec simplement une expression régulière.
    Je n'ai peut être pas placé mon message dans la bonne rubrique.

  12. #12
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Ahhh .... mais pourtant la méthode Split utilisée est bien une méthode de TPerlRegex

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par benoit1024 Voir le message
    Comme je l'ai dit, le problème n'est plus de résoudre ce problème avec Delphi, c'est comment faire avec simplement une expression régulière.
    Moi je dirais qu'on ne peut pas le faire, comme vous voulez le faire, c'est-à-dire (si j'ai bien compris) en capturant un à un tous les groupes avec la même expression.

    En cherchant bien, on arriverait sûrement à trouver une expression compliquée et incompréhensible, qui reviendrait de toute façon à utiliser la méthode Split. En effet, tout ce qu'on sait, en l'occurrence, des groupes à extraire, c'est qu'ils ne contiennent pas de séparateur.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Ahhh .... mais pourtant la méthode Split utilisée est bien une méthode de TPerlRegex
    ok, désolé, je n'avait pas compris. c'est donc surement ce qu'il me fallait. je vais vérifié, je ne connaissais pas.

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

Discussions similaires

  1. regex avec javascript
    Par zabdaniel dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 15/05/2008, 17h41
  2. Appliquer regex avec parenthèse capturantes sur SELECT
    Par vallica dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/02/2008, 12h34
  3. [RegEx] Regex avec condition
    Par yudao dans le forum Langage
    Réponses: 6
    Dernier message: 29/05/2007, 15h08
  4. REGEX avec variable
    Par Mat_F dans le forum Langage
    Réponses: 3
    Dernier message: 21/07/2006, 19h24
  5. Problème de Regex ... avec un point
    Par bugalood dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2005, 10h26

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