2009-10-20 7 views
2

J'ai besoin d'une expression régulière pour trouver des déclarations de classe afin que je puisse ajouter un #define avant le mot-clé "class". L'expression régulière n'a pas besoin d'être parfaite, juste assez pour qu'elle capture la plupart des cas.Expressions régulières pour trouver des déclarations de classe dans le code C++

+0

La regex doit-elle correspondre à la totalité de la déclaration (probablement multi-lignes), ou simplement au mot-clé class? Ce dernier est facile à obtenir la plupart du temps juste; pour le premier, une regex est probablement le mauvais outil. –

Répondre

2

Que diriez-vous:

/^\s*class\s/ 

Cela devrait fonctionner raisonnablement bien. Je ne suis pas tout à fait sûr.

2
/class\s+([^\s]+)/ 

Ceci va capturer le nom de la classe comme $ 1 (ou l'équivalent dans n'importe quel framework regex que vous utilisez). Cela fonctionnera pour les classes de modèle qui peuvent avoir des espaces à l'intérieur du <> qui suit le nom de la classe. L'analyse est quelque chose qui n'est pas faisable avec une expression régulière, car elle nécessite des paires équilibrées de chevrons.

3
/.*class\s+([^{]+)\s*[:]?([^{]+){/ 

Cela devrait fonctionner pour la plupart des définitions de classes, y compris les classes de modèles. Le nom de la classe est capturé en $ 1 et s'il s'agit d'une classe dérivée, la base sera en $ 2.

1

La réponse de Yannick couvre la plupart du temps, mais elle correspond malheureusement aussi en avant les déclarations (et le texte qui suit ci-dessous les) et les énumérations strictes à savoir enum class myStrictEnum { // stuff };

Cela fonctionne bien et est assez stricte, mais elle est sans doute plus prolixe que ce besoin.

^(?!enum).*class\b\s\b[A-Za-z_][A-Za-z_0-9]*\b\s*($)?(|:\s*($)?(public|private|protected)\s*($)?\b[^{]*\s*)\s*($)?{ 
Questions connexes