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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    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 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    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...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 12
    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    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 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 596
    Billets dans le blog
    65
    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 933
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    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)

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