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 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 923
    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 923
    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 584
    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 584
    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 923
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 923
    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 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
    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 éprouvé Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    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