1. #1
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2007
    Messages
    2 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2007
    Messages : 2 486
    Points : 2 290
    Points
    2 290

    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
    3 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 008
    Points : 10 849
    Points
    10 849
    Billets dans le blog
    4

    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', '=');

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2007
    Messages
    2 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2007
    Messages : 2 486
    Points : 2 290
    Points
    2 290

    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
    3 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 3 008
    Points : 10 849
    Points
    10 849
    Billets dans le blog
    4

    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

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2007
    Messages
    2 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2007
    Messages : 2 486
    Points : 2 290
    Points
    2 290

    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
    Inscrit en
    janvier 2007
    Messages
    8 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 442
    Points : 19 720
    Points
    19 720
    Billets dans le blog
    4

    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', '[=,]')
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2007
    Messages
    2 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2007
    Messages : 2 486
    Points : 2 290
    Points
    2 290

    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