2013-09-16 6 views
1

Je suis en train d'apprendre Tcl et les expressions régulières. J'ai une tâche que j'ai besoin d'un script Tcl pour préformer et besoin d'aide.expressions régulières et Tcl

J'ai un fichier d'en-tête C++ que je veux analyser dans une table. C'est un fichier qui définit les constantes.

Il y a 2 formes que je dois analyser:

const int a = 0x00000001; //Comment for this variable 
const int b = 0x00000003; //Comment for this variable 

et définitions dans un ENUM comme:

CONSTNAMEA = MACROA | MACROB | 0x000A, //Comment for this variable 
CONSTNAMEB = MACROA | MACROB | 0x00C1, //Comment for this variable 

Dans le premier groupe, je devais remplacer '=' et ' " avec '|'. Cela a été facilement fait avec regsub. Cependant, le deuxième groupe est un peu plus compliqué et je n'arrive pas à le comprendre. Ce que je veux être capable de faire est de sortir 'CONSTNAMEA', '0x000A', et les commentaires dans des variables séparées. Je pense que j'ai besoin de trois regex. Un pour analyser le nom, un autre pour le nombre, et un troisième pour le commentaire.

The name regex would be "Start at beginning of string and stop at '='" 
The number would be '|' {anything} ',' 
And the comment would be "//" {anything} '\n' 

Correct? J'apprécierais toute aide pour la construction de ces expressions régulières!

+0

Pourquoi ne pas ajouter une balise pour Tcl? – crashmstr

+0

Je pensais que c'était plus une question de regex, mais bon point. Je vais l'ajouter. – radensb

Répondre

1

Une seule expression régulière devrait suffire pour capturer les trois sous-chaînes de la ligne:

^\s*([a-zA-Z_]+)\s*=(?:\s*[a-zA-Z_]+\s*\|)*\s*([0-9a-fA-Fx]+),\s*\/\/(.*)$ 

Le nom sera disponible en tant que le premier groupe, le numéro comme le second et le commentaire que le troisième .

Pour déboguer des expressions comme celle-ci, je recommande un outil tel que regexper, qui convertira une expression régulière comme ci-dessus en un diagramme de chemin de fer facile à suivre.