Re: Expression régulière multi-lignes

Top Page

Reply to this message
Author: Frédéric Mantegazza
Date:  
To: Patrice Karatchentzeff
CC: Frédéric Mantegazza, guilde
Subject: Re: Expression régulière multi-lignes
Le Lun 8 juin 2009 13:36, Patrice Karatchentzeff a écrit :

> Qu'est-ce qui t'intéresse vraiment à obtenir et quel est le contexte
> du fichier ?


Ce n'est pas un fichier, mais un message qui transite via un socket réseau.

> Ton truc est 1000 fois trop tordu pour une regexp.


Qu'y a-t-il de tordu ? Si les regexp ne servent pas à ce genre de chose,
je ne vois pas à quoi elles peuvent bien servir !

Je veux d'une part valider la structure du message, et d'autre part le
décoder. Il me semble que l'utilisation des groupes nommés est bien
pratique, non ? Si le décodage de l'expression est valide, je n'ai plus
qu'à récupérer chaque groupe.

En fait, j'ai réussi à faire à peu près ce que je voulais, avec
l'expression suivante (que j'espère plus claire, en utilisant le mode
verbose) :

(?P<type>xpl-cmnd | xpl-trig | xpl-stat)\n
\{\n  # Start of header
hop=(?P<hop_count>[1-9])\n
source=(?P<source>
           (?P<source_vendor_id>.{1,8}?)
           -
           (?P<source_device_id>.{1,8}?)
           \.
           (?P<source_instance_id>.{1,16}?)
       )\n
target=(?P<target>
           (
               (?P<target_vendor_id>.{1,8}?)
               -
               (?P<target_device_id>.{1,8}?)
               \.
               (?P<target_instance_id>.{1,16}?)
           ) |
           \*
       )\n
\}\n  # End of header
(?P<schema>
    (?P<schema_class>.{1,8}?)
    \.
    (?P<schema_type>.{1,8}?)
)\n
\{\n  # Start of data
(?P<data>
    (?:
        .{1,16}?
        =
        [^\n]{1,128}?\n
    )+
)
\}  # End of data


Je voudrais l'améliorer sur le bloc data. Là, je récupère tout dans le
groupe 'data'. Mais j'aimerais plutôt avoir un groupe par paire
clé/valeur, voir un groupe pour chaque. Groupe non nommé, bien sûr.

Est-ce faisable ?

-- 
    Frédéric