Par défaut d'un format de message en pseudo BNF à une expression regu

Par défaut d'un format de message en pseudo BNF à une expression regu - Divers - Programmation

Marsh Posté le 18-07-2009 à 01:03:52    

Salut,
Je voudrait faire l'expression réguliere correspendante au format des messages IRC qui sont décrit avec le format suivant ici http://www.irchelp.org/irchelp/rfc [...] tml#c2_3_1 :

 

Voir : http://www.irchelp.org/irchelp/rfc [...] tml#c2_3_1 ou http://www.iprelax.fr/irc/irc_rfcfr2.php
L'expression régulière correspondante que j'ai fait est:

 

^(:(\w+)(![^ \r\n]+)?(\@[^ \r\n]+)? )?([a-zA-Z]+|\d\d\d)(( [^: \r\n][^ \r\n]*)+)( :[^\r\n]*)?

 

Mais ça ne marche pas à tout les cas; ça dois surement être bugué vu que je ne my connais pas trop en expressions régulières.
Pouvez vous m'aider à la construire ?

 

Vous pouvez voir des exemples de ce qui marche et ce qui ne marche pas ici: http://www.developpez.net/forums/d [...] ost4494010

 

Merci


Message édité par tomap le 21-07-2009 à 17:17:02
Reply

Marsh Posté le 18-07-2009 à 01:03:52   

Reply

Marsh Posté le 18-07-2009 à 05:13:57    

Une expression régulière (une vrai, pas une avec toutes les extensions non-régulières ala Perl) ne peut pas forcément modéliser une BNF.

 

Par exemple :

<foo> ::= 'a' [<foo>] 'b'


Est une BNF très simple (les mots a+b+ avec autant de a que de b) que tu ne peut pas faire avec une simple regexp.

 

Cela dit en jetant un premier coup d'oeil, cette BNF semble faisable de faire ça avec une regexp.

 

Si tu tiens à faire ça avec une regexp, commence déja par la construire par petit bout, et débugge chaque morceau séparément.

 

Commence par écrire les regexp des règles terminales de ta BNF (les règles qui appellent pas d'autres règles, juste des séries de caractères comme <lettre>, <spécial> ou <non blanc> ).
Puis crée les règles non-terminales en concaténant les variables des autres regexp (en oubliant pas les | [] et les parenthèses non-capturantes) pour la priorité.

 

Teste séparément chaque règle avant de la réutiliser, en faisant comme ça tu t'en sortira plus efficacement qu'en triturant un super-monstre de 4km de long.

 

PS: quand je dis concaténer les regexp, je veut dire concaténer la chaine de caractère qui définit la regexp, si tu additionne directement des regexp ça va pas marcher.


Message édité par 0x90 le 18-07-2009 à 05:14:08

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed