2008-09-10 6 views
4

J'ai essayé de trouver une regex pour me permettre de rechercher une chaîne particulière tout en sautant automatiquement les commentaires. Quelqu'un at-il un RE comme celui-ci ou en connaissez un? Il n'a même pas besoin d'être assez sophistiqué pour sauter #if 0 blocs; Je veux juste qu'il saute les blocs // et /*. L'inverse, c'est-à-dire la recherche dans les blocs de commentaires, serait très utile aussi.Regex pour les développeurs

Environnement: VS 2003

Répondre

3

Ce problème est plus difficile qu'il n'y paraît à première vue, puisque vous devez considérer les jetons de commentaires dans les chaînes, les jetons de commentaires qui sont eux-mêmes commentées, etc.

J'ai écrit une enchaînez et commentez l'analyseur pour C#, laissez-moi voir si je peux creuser quelque chose qui aidera ... Je mettrai à jour si je trouve quelque chose.

EDIT: ... ok, donc j'ai trouvé mon ancien projet 'codemasker'. Il s'avère que j'ai fait cela par étapes, pas avec une seule regex. Fondamentalement je pouce à travers un fichier source à la recherche de jetons de départ, quand j'en trouve un, je cherche ensuite un jeton de fin et masque tout entre les deux. Ceci prend en compte le contexte du jeton de départ ... si vous trouvez un jeton pour "début de chaîne", vous pouvez ignorer les jetons de commentaire jusqu'à ce que vous trouviez la fin de la chaîne, et vice versa. Une fois que le code est masqué (j'ai utilisé des guids comme masques, et une hashtable pour garder la trace), vous pouvez effectuer votre recherche et le remplacer en toute sécurité, puis restaurer le code masqué.

Espérons que cela aide.

2

Soyez particulièrement prudent avec les chaînes. Les cordes ont souvent des séquences d'échappement que vous devez aussi respecter lorsque vous en trouvez la fin.

Ainsi, par exemple. "This is \"a test\"". Vous ne pouvez pas chercher aveuglément un double guillemet pour terminer. Méfiez-vous également de `` "Ceci est \" `, ce qui montre que vous ne pouvez pas simplement dire" à moins que les guillemets doubles soient précédés d'un antislash ". En résumé, faites des tests unitaires brutaux!

1

Je voudrais faire une copie et enlever les commentaires d'abord, puis rechercher la chaîne de façon régulière.

2

Une regexp n'est pas le meilleur outil pour le travail.

Perl FAQ:

C Commentaires:

#!/usr/bin/perl 
$/ = undef; 
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g; 
print; 

C++ Commentaires:

#!/usr/local/bin/perl 
$/ = undef; 
$_ = <>; 

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+# $1 ? "/*$1 */" : $& #ge; 
print; 
+0

Ce lien FAQ est mort. Je pense qu'il a déménagé [ici] (http://perldoc.perl.org/perlfaq6.html#How-do-I-use-a-regular-expression-to-strip-C-style-comments-from-a -file% 3f) –

+0

@Matt Mendell: merci. J'ai mis à jour le lien – jfs

Questions connexes