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 :

TRegx et multiligne ( DELPHI 10.3)


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut TRegx et multiligne ( DELPHI 10.3)
    Bonjour,

    J'ai un fichier XML et je veux extraire certaines informations du texte de ce fichier. C'est ok quand tout est en ligne mais , KO quand j'ai des retours chariots/sauts de ligne ( #13#10 )

    Exemple :

    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
     
     
     
    uses ...  System.RegularExpressions 
     
    ...
     
    procedure TForm42.Button1Click(Sender: TObject);
     
    const   chaine1 ='<transformation> <info> <name>NOM_FICHIER</name>';
     
    const   chaine2 ='<transformation>'#13#10'<info>'#13#10'<name>NOM_FICHIER</name>';
     
    var
      regex : TRegEx;
      Match  : TMatch;
    begin
     
      Match :=regex.Match(chaine1,'<transformation>.+<name>(.+)</name>');
     
    //  Match :=regex.Match(chaine2,'<transformation>.+<name>(.+)</name>');
     
      if Match.Success then
      begin
        showMessage('OK');
        ShowMessage ( Match.Groups[1].Value );
      end
      else
      begin
        showMessage('Non rien :( ');
      end;
     
    end;

    Le code fonctionne avec la chaine1 mais pas la chaine2 .


    Est ce que vous avez une idée de comment extraire mes infos dans un texte avec sauts de ligne ?


    Merci d'avance .

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 875
    Points : 11 365
    Points
    11 365
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Ne connaissant pas ces expressions rationnelles, j'utiliserais barbarement : chaine1 := StringReplace(chaine2, CRLF, ' ', [rfReplaceAll]); qui a pê de plus beaux équivalents et surtout un motif adaptable en regexp...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Ne connaissant pas ces expressions rationnelles, j'utiliserais barbarement : chaine1 := StringReplace(chaine2, CRLF, ' ', [rfReplaceAll]); qui a pê de plus beaux équivalents et surtout un motif adaptable en regexp...

    Bonjour,
    J'y ai pensé pour d'autres raisons je dois conserver la structure inter-balises , pour faire des découpage plus complexes . C'est juste un exemple simple .
    Merci en tout cas .

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 893
    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 893
    Points : 6 642
    Points
    6 642
    Par défaut
    L'option que tu cherches est roSingleLine, mais tu t'exposes à des déconvenus en t'attaquant à du XML comme avec une simple chaîne. Il doit bien avoir des parsers DOM ou SAX pour faire ça avec Delphi.

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut
    Perso, je trouve les expressions mal "fagotées", je suggère un outil comme Expresso pour mieux maitriser ça

    (\x0A\x0D)? devrait remplacer un #13#10

    soit une expression comme cela

    Code RegEx : Sélectionner tout - Visualiser dans une fenêtre à part
    '<transformation>(\x0A\x0D)?<info>(\x0A\x0D)?<name>NOM_FICHIER</name>'
    mais il y a certainement mieux

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Il y a aussi des espaces. En multilines on pourrait l'écrire ainsi : <transformation>(?: |\R)?<info>(?: |\R)?<name>(.+)</name>.

    En singleline, attention s'il peut y avoir plusieurs fois la même information, il faudra passer en mode lazy sous peine de ne récupérer que le dernier NOM_FICHIER : <transformation>.+?<name>(.+?)</name>.


    ps : bizarre que ça fonctionne sous Delphi, le standard PCRE demande normalement que les / soient échappés : <\/name> (les deux écritures fonctionnent)

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 893
    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 893
    Points : 6 642
    Points
    6 642
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    ps : bizarre que ça fonctionne sous Delphi, le standard PCRE demande normalement que les / soient échappés : <\/name> (les deux écritures fonctionnent)
    Non, c'est juste une croyance répandue (du fait que le slash est souvant utilisé dans plusieurs langages pour délimiter les patterns), mais ce n'est pas un caractère spécial.
    En dehors des classes de caractères, Il y en a douze à échapper: . ? * + ( ) [ { | \ ^ $ (et encore pour le {, suivant le contexte on peut s'en passer)

  8. #8
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 214
    Points : 223
    Points
    223
    Par défaut
    A la place de .+, j'aurai plutôt utilisé (.|\n)* ou ((?:.|\n)*) pour capturer le groupe

Discussions similaires

  1. [JTable] Cellules multilignes dans un jtable
    Par chesteric31 dans le forum Composants
    Réponses: 15
    Dernier message: 06/06/2005, 14h50
  2. Connaître la hauteur d'un texte multilignes
    Par Crisanar dans le forum Windows
    Réponses: 2
    Dernier message: 22/11/2004, 23h01
  3. [TCombobox] Item multiligne
    Par Bernard Grosdoy dans le forum Composants VCL
    Réponses: 9
    Dernier message: 28/09/2004, 10h11
  4. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  5. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56

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