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

Composants VCL Delphi Discussion :

[RegExpr] Comment extraire de l'information contenant toute sorte de caractères ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut [RegExpr] Comment extraire de l'information contenant toute sorte de caractères ?
    Bonjour à tous,

    je voudrais utiliser RegExpr pour extraire ce qui se trouve entre des balises ayant la forme suivante :

    <br><br>x.
    x : un nombre variable composé de [0-9]

    Oui mais voilà entre ces deux balises j'ai vraiment du texte libre avec tous les caractères possible, des , ; : - etc..

    Est-ce quelqu'un pourrait m'aider pour mon expression et ma boucle à faire ?

    PS : si il existe une autre solution aussi rapide, je suis preneur biensûr

    Cordialement,
    Bruno

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,
    je ne connait pas RegExpr, donc je ne peux pas vous répondre sur votre question principale.

    Par contre, en ce qui concerne votre PS, je me demande si vous avez tester SearchBuf.

    Cette commande permet de chercher de chercher la position d'un texte dans un autre (comme pos). contrairement a la fonction Pos, SearchBuf permet d'indiquer a partir de quelle position de la chaine faire la recherche.

    Le plus difficile vient du faite qu'il travail en pointeur et pchar plutôt qu'en integer et string.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Bonjour et merci pour votre réponse, mais dans ma chaîne à rechercher, il y a une partie variable, en fait c'est le x qui représente un chiffre.

    C'est vrai que dans mon texte, je ne l'avais pas indiqué.

    Amicalement,
    Bruno

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Re-Bonjour,

    alors voilà avec cette expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      RE = '<br><br>\d{1,2}\.(.+?)<br><br>\d{1,2}\.';
    j'obtiens une extraction sur deux, car le résultat de ma premiere extraction posséde le tag de debut de la deuxieme phrase à extraire
    et donc, j'ai une bonne extraction sur deux.
    hum... je sais pas si j'ai été clair. Enfin je veux juste dire qu'en résultat j'ai

    <br><br>1. kldsjflksjdlkfsjdlkfjsdf<br><br>2.

    <br><br>3. qskllqksdkljqlksdjlqksjdlkqjslk<br><br>4.

    <br><br>5. etc...<br><br>6.
    etc...
    Comment faire pour que mon expression régulière ne prenne pas le debut des prochaines chaines à Extraire ?

    Pour info, voici mon bout de code:
    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
     
       s := sPhrase;
       R := TRegExpr.Create;
       Try
         R.Expression := RE;
         if r.Exec (s) then
          REPEAT
            MonObjet.Definition := R.match[0];
            MonObjet.Id         := ExtractNoClaim(MonObjet.Definition);
            MonObjet.Reference  := ExtractReferenceTo(MonObjet.Definition);
     
            VST.addChild(GetFather(MonObjet), MonObjet);
          UNTIL not R.ExecNext;
       Finally
          R.Free;
       End;
    Dans l'attente de vous lire,
    Amicalement,
    Bruno

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Bon je sais que c'est pas vraiment beau comme programmation mais j'ai tout simplement utilisé 2 PASS.

    La première extrait les <br><br>x. que je transforme en <FINTAG><br><br>x.

    Ensuite la deuxieme PASS est plus simple puisque maintenant j'ai un TAG de début <br><br>x. et un tag de fin <FINTAG>

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    procedure TForm1.Button3Click(Sender: TObject);
    const
      RE  = '<br><br>\d{1,2}\.';
      RE2 = '<br><br>\d{1,2}\.(.+?)<FINTAG>';
    var
     MonObjet : TMonObjet;
     Z        : TStringList;
     s        : String;
     R        : TRegexpr;
    begin
     Z:=TStringList.Create;
     Try
       if OpenDialog1.Execute then
       begin
         Z.LoadFromFile(OpenDialog1.FileName);
         s:=FormatClaim(Z.Text);
       end;
     
       // Premiere etape, je retransforme les balises en ajoutant une fin
       R := TRegExpr.Create;
       Try
         R.Expression := RE;
         if r.Exec (s) then
          REPEAT
            s:=FastReplace(s, R.match[0], '<FINTAG>'+R.Match[0]);
          UNTIL not R.ExecNext;
       Finally
          R.Free;
       End;
     
       // J'extrait les textes comme d'habitude mais cette fois-ci c'est plus simple
       R := TRegExpr.Create;
       Try
         R.Expression := RE2;
         if r.Exec (s) then
          REPEAT
     
             showmessage(FastReplace(FastReplace(R.match[0], '<FINTAG>', ''), '<br><br>', '');
     
          UNTIL not R.ExecNext;
       Finally
          R.Free;
       End;
     Finally
       Z.Free;
     End;
    end;

Discussions similaires

  1. Réponses: 12
    Dernier message: 28/03/2013, 09h02
  2. Comment extraire tout les id ayant le meme prefix
    Par pierrot10 dans le forum jQuery
    Réponses: 23
    Dernier message: 24/02/2012, 22h19
  3. [OL-2003] comment extraire des informations depuis des mails en HTML
    Par boulhous dans le forum Outlook
    Réponses: 0
    Dernier message: 16/02/2010, 16h47
  4. Réponses: 5
    Dernier message: 29/03/2007, 14h43

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