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