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 :

Difficulté à extraire une chaine répartie sur deux lignes


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut Difficulté à extraire une chaine répartie sur deux lignes
    Bonjour,

    J'ai créé une expression régulière pour extraire une chaine qui est (parfois) répartie sur deux lignes.
    Le contenu de la seconde ligne n'apparaît pas lorsqu'il existe.

    Voici ma RegEx: '.*(' + EdDestination.Text + '[^\n<>]+)'. Avec 'EHAM' comme EdDestination.Text
    En Delphi XE5.

    Voici la partie du texte à extraire:
    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
     METAR/SPECI from <font color="#0713FD">EHAM, Amsterdam Airport Schiphol (Netherlands).</font></strong></caption>
    <tr bgcolor='#F0F0D0'><td>SA</td>
    <td>21/08/2014 11:55-></td>
    <td><font size="-1"><b><pre>METAR EHAM 211155Z 26014KT 9999 FEW027 FEW030TCU 16/10 Q1015
               NOSIG=</pre></b></font></td>
    </tr>
    <tr bgcolor='white'><td>SA</td>
    <td>21/08/2014 11:25-></td>
    <td><font size="-1"><b><pre>METAR EHAM 211125Z 23009KT 9999 SCT032 17/10 Q1015 NOSIG=</pre></b></font></td>
    </tr>
    </table><br>
    <!--comienzo del epilogo-->
    </TD>
    </TR>
    <TR>
    Le mot "NOSIG=" de la seconde ligne n'apparaît pas.

    Pourriez-vous m'aidez?

    Merci

    Cordialement
    Pierre

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    C'est normal qu'il n'apparaisse pas étant donné que tu as exclu le caractère de nouvelle ligne de ta classe de caractère: [^\n<>]+. Tu peux la changer en [^<]+. (donc la correspondance ira jusqu'au prochain caractère <, inutile d'exclure > ou \n.)

    À propos de ton approche:

    À noter que ce genre de pattern est particulièrement inefficace car elle commence par .* (qu'il faudrait d'ailleurs remplacer par [^>]* ou par (?:[A-Z]+\s+)? s'il ne peut y avoir qu'un seul mot avant), ce qui est très permissif. Et comme il n'y a aucun ancrage au début de la pattern (car ce n'est pas possible dans ce cas là) et que .* n'a pas de taille fixe, le moteur de regex va devoir tester la pattern à chaque position de la chaîne, aller tout au bout de la ligne, reculer caractère par caractère jusqu'au caractère de départ, puis recommencer avec le caractère suivant, etc. C'est une complexité énorme.

    Une approche plus performante consisterai à ne chercher que \bEHAM\s+[^<]+ à extraire l'offset de la correspondance, puis d'extraire une sous chaîne de n caractères (taille à déterminer selon tes besoins) avant cet offset, de retourner la sous-chaîne et de trouver la position du premier > afin de récupérer les caractères situés avant (qu'il faut remettre à l'endroit). Après c'est juste du calcul et de la concaténation. Cette approche est avantageuse quand on ne connait pas la taille du texte à extraire avant le mot mais qu'on a une idée de sa taille maximum.

    Une approche plus propre, plutôt que de faire une recherche directement à coup de regex dans du html, ce serait plus efficace d'utiliser XPath pour extraire les noeuds texte qui sont susceptibles de contenir ce que tu cherches (de part leur position dans l'arbre DOM) tout en contrôlant qu'ils contiennent le text que tu cherches. Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //tr/td/font/b/pre/text()[contains(self::node(), 'EHAM')]
    quitte à devoir affiner ensuite avec une regex.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Bonjour

    Merci de tout ces conseils, dont je vais tenir le plus grand compte.

    Je reviendrai vers toi pour un feedback.

    Cordialement
    Pierre

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    La "non-détection" sur plusieurs lignes vient souvent de l'oubli de l'option soSingleline dans l'utilisation de la classe TRegex.

Discussions similaires

  1. Champs répartis sur deux lignes de même id
    Par philphil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2013, 16h31
  2. mettre une requête SQL sur deux lignes
    Par MAMANHOU dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/11/2008, 15h37
  3. Texte de la barre de titre d'une Jframe sur deux lignes
    Par radzar dans le forum Agents de placement/Fenêtres
    Réponses: 17
    Dernier message: 01/09/2007, 01h10
  4. Réponses: 4
    Dernier message: 02/06/2007, 12h35
  5. ecrire sur deux ligne dans une button
    Par zidenne dans le forum Delphi
    Réponses: 5
    Dernier message: 27/07/2006, 10h23

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