PDA

View Full Version : Regexp Master


rom
04-12-2006, 05:03 PM
Hello All,

Dans la mesure ou je cherche la meilleure expression reguliere pour l'upload des conf Oreon/Nagios, j'aurais aime savoir si un de vous savait elever cette pratique au rang de l'art, et si il avait donc pu me sortir de son chapeau LA regexp qui poutre.

Voila par exemple ce qu'il faut matcher :

service_description ping
hostgroup_name Site_1, Site_2

Sachant qu'on peut peut avoir ce genre de cas avec des arguments utilisant des caracteres speciaux :
check_command check_cpu_load!60,90,95,120,90,95

Ou encore
hostgroup_name Site_1 # la par contre c un commentaire

+ ce que vous pouvez imaginer, n'hesitez d'aileurs pas a completer ce post avec vos exemples.

Donc voila, la precedente mouture de la regexp presentait des lacunes, je vais l'ameliorer mais si vous pouvez m'aider, ca sera avec plaisir :roll:

Voici l'ancienne :
Nagios.cfg :
("/^[ \t]*([0-9a-zA-Z\_ ]+)[ \t]*=[ \t]*(.+)/", $str, $regs)
*.cfg
("/^[ \t]*([\w\-]+)[ \t]+([\|\(\)\>\<\?\!\{\}\$-_\/+:\.@\"\'\d\w\s]+)/", $str, $regs)

julio
04-12-2006, 05:46 PM
ce qui serait bien deja c'est de la fait terminer par un \#.*$ pour ne pas chopper les commentaires...

"/^[ \t]*([0-9a-zA-Z\_ ]+)[ \t]*=[ \t]*(.+)/" -> "/^[\s\t]*([0-9a-zA-Z\_\s]+)[\s\t]*=[\s\t]*(.+)\#.*$/"


"/^[ \t]*([\w\-]+)[ \t]+([\|\(\)\>\<\?\!\{\}\$-_\/+:\.@\"\'\d\w\s]+)/" -> "/^[ \t]*([\w\-]+)[\s\t]+([\|\(\)\>\<\?\!\{\}\$\-\_\/+\:\.@\"\'\d\w\s]+)#.*$/"

templuche
04-12-2006, 05:56 PM
Bonjour,

Cela me semble très complexe... Ce ne serait pas mieux de faire du ligne par ligne, d'identifier
- si la ligne contient un check_command alors parser le paramètre avec la fonction dédiée à la check_command
- si la ligne contient un host_name alors parser le paramètre avec a fonction dédiée pour le host_name
- si c'est un hostgroup_name alors...

Cela fait plein de cas mais semble plus simple à implémenter.

julio
04-12-2006, 05:57 PM
correction, enfin je pense que c'est mieux, mais c pas testé...

"/^[ \t]*([0-9a-zA-Z\_ ]+)[ \t]*=[ \t]*(.+)/" -> "/^[\s\t]*([0-9a-zA-Z\_\s]+)[\s\t]*=[\s\t]*(.+)\#*.*$/"


"/^[ \t]*([\w\-]+)[ \t]+([\|\(\)\>\<\?\!\{\}\$-_\/+:\.@\"\'\d\w\s]+)/" -> "/^[ \t]*([\w\-]+)[\s\t]+([\|\(\)\>\<\?\!\{\}\$\-\_\/+\:\.@\"\'\d\w\s]+)#*.*$/"

rom
04-13-2006, 12:41 AM
Voila la regexp v1.1 pour ce soir, elle passe pas mal de mes tests, merci de m'envoyer les votres, meme si la difficulte semble anodine :D

^[^#][ \t]*(.[^ \t]+)[ \t]+(.[^#]+)

Je vous conseille au passage ce petit outil :
http://weitz.de/regex-coach/

wistof
04-13-2006, 02:11 AM
Je vous conseille au passage ce petit outil :
http://weitz.de/regex-coach/

Merci qui ? :P

rom
04-13-2006, 09:30 AM
Merci Wistof :wink:

rom
04-13-2006, 03:50 PM
J'en suis actuellement la :
^[^#][ \t]*(.[^ \t]+)[ \t]+(.[^#]+)

Et ca passe pour ca :

define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}

Mais pas pour ca (espacement) :

define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}


Une idée ?

surcouf
04-13-2006, 04:15 PM
J'en suis actuellement la :
^[^#][ \t]*(.[^ \t]+)[ \t]+(.[^#]+)

Et ca passe pour ca :

define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}

Mais pas pour ca (espacement) :

define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}


Une idée ?

Que ce soit en PHP ou en Perl, pourquoi ne pas utiliser un module ou une classe déjà existante et permettant de parser ce genre de fichiers ?

rom
04-13-2006, 04:29 PM
Hum, et bien parce que ce n'est pas qq chose a mon sens qui court les sites, mais je dois avouer que je n'ai meme pas chercher.

En fait ca ne me parait pas vraiment compliquer et la procedure qui entoure la regexp colle parfaitement a oreon donc il ne manque plus que cette petite brique, mais n'etant pas le 'regexp master' par definition, j'ai solicité votre aide :)

Maintenant mis a part ce detail c'est nickel, et julio m'a souffle une astuce :D

rom
04-19-2006, 01:01 AM
Voila la derniere mouture, aucun prob jusqu'ici.


$regexp = "/^[ \t]*(.[^ \t#]+)[ \t]+(.[^;]+)/";