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 et split


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    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 381
    Points : 2 995
    Points
    2 995
    Par défaut Expression régulière et split
    Bonjour

    Il y a quelque chose que je n'ai pas dû comprendre dans TRegex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      const
        P = '([^=]*)\=(.*)';
     
    ...
     
          Mch := TRegEx.Match('HVP=HVP', P);
          ShowMessage(Mch.Groups[1].Value + ' - ' + Mch.Groups[2].Value);
     
          R := TRegEx.Split('HVP=HVP', P);
          ShowMessage(R[1] + ' - ' + R[2]);
    Le premier ShowMessage affiche

    [Window Title]
    Trad

    [Content]
    HVP - HVP

    [OK]

    Le second :

    [Window Title]
    Trad

    [Content]
    HVP -

    [OK]

    Le split n'est pas censé renvoyer un tableau contenant les 2 éléments trouvés par le Match ?????

    Précision, en debug, le tableau R renvoyé par Split contient 3 éléments:
    R[0] = ''
    R[1] = 'HVP'
    R[2] = ''

    Est-ce bien logique tout ça ?

  2. #2
    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 !

    L'index du tableau va de zéro à nombre d'éléments moins un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    uses
      SysUtils, RegularExpressions;
     
    var
      a: TArray<string>;
      i: integer;
     
    begin
      a := TRegEx.Split('a b,c-d', '[ ,-]');
     
      for i := Low(a) to High(a) do
        WriteLn(i, ' ', a[i]);

    Le deuxième argument de la méthode Split() représente les séparateurs. Donc, dans votre cas, il faudrait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      a := TRegEx.Split('HVP=HVP', '=');
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    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 381
    Points : 2 995
    Points
    2 995
    Par défaut
    Le deuxième argument de la méthode Split() représente les séparateurs. Donc, dans votre cas, il faudrait écrire :
    Ça n'est pas ce qui est dit dans l'aide :-(

    class function Split(const Input, Pattern: string): TArray<string>; overload; static;
    class function Split(const Input, Pattern: string; Options: TRegExOptions): TArray<string>; overload; static;
    Il n'est pas fait mention de séparateur mais de pattern. C'est la fonction SplitString qui prend ce genre paramètres.

    Et j'ai bien montré le contenu du tableau complet avec tous les R[n] sans en oublier un.


    Après test, en mettant '=' comme pattern, ça donne le bon résultat.
    Que faut-il en déduire ? Que TRegex.Split n'a aucune utilité si on ne peut pas utiliser de pattern d'expression régulière ??

    DescriptionDécompose la chaîne d'entrée conformément aux correspondances par une expression régulière.

    La chaîne Input est décomposée dans les limites définies par les correspondances avec une expression régulière et est renvoyée dans un TStringDynArray.

    L'expression régulière est spécifiée par le paramètre Pattern, s'il est présent. Sinon, l'expression régulière est spécifiée dans l'instance de TRegEx en cours, définie dans la construction TRegEx.

    Count indique le nombre maximal de fois que cette chaîne Input peut être décomposée.

    StartPos indique le nombre de caractères dans la chaîne Input pour commencer la correspondance.

    Options exécute la correspondance de l'expression régulière.

  4. #4
    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
    Citation Envoyé par Papy214 Voir le message
    Il n'est pas fait mention de séparateur mais de pattern.
    Justement, le séparateur est défini par une expression régulière, comme on le voit dans l'exemple que j'ai posté plus haut. Voici un autre exemple, où le séparateur est un chiffre ou une suite de chiffres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    uses
      SysUtils, RegularExpressions;
     
    var
      a: TArray<string>;
      i: integer;
     
    begin
      a := TRegEx.Split('D234e55l6p7h8i', '\d+');
     
      for i := Low(a) to High(a) do
        WriteLn(i, ' ', a[i]);
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    0 D
    1 e
    2 l
    3 p
    4 h
    5 i
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    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 381
    Points : 2 995
    Points
    2 995
    Par défaut
    Ok ! Et donc, pour découper sur plusieurs séparateurs ?

    Exemple:
    Caption=00000001,Mon soft

    pour obtenir

    Caption
    00000001
    Mon soft

    Je viens de tester TRegex.Split('Caption=00000001,Mon soft', '=,') et ça me renvoie un tableau à 1 seul élément qui contient la chaîne entière de départ.

  6. #6
    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 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Papy214 Voir le message
    TRegex.Split('Caption=00000001,Mon soft', '=,')
    il te manque simplement les [] de l'alternative
    TRegex.Split('Caption=00000001,Mon soft', '[=,]')
    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

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 381
    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 381
    Points : 2 995
    Points
    2 995
    Par défaut
    argh ... fait pas bon réfléchir le lundi matin !

    Merci les amis ....

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

Discussions similaires

  1. Split expression régulière
    Par abbescr7 dans le forum Général Java
    Réponses: 14
    Dernier message: 11/12/2015, 21h30
  2. Expression régulière pour "éclater" (split) une chaîne
    Par SergioMaster dans le forum Langage
    Réponses: 26
    Dernier message: 01/10/2015, 20h59
  3. Réponses: 1
    Dernier message: 05/08/2015, 09h59
  4. Réponses: 4
    Dernier message: 26/05/2014, 15h52
  5. Split et expression régulière
    Par MaitrePylos dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2007, 14h47

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