Question

J'ai été à essayer de comprendre un regex pour me permettre de rechercher une chaîne de caractères tout en ignorant les commentaires.Quelqu'un a une RE comme ceci ou connaissez une?Il n'a même pas besoin d'être suffisamment sophistiqué pour sauter #if 0 blocs;J'ai juste envie de sauter // et /* les blocs.À l'inverse, c'est seulement à la recherche à l'intérieur des blocs de commentaires, serait très utile aussi.

Environnement:VS 2003

Était-ce utile?

La solution

C'est un problème plus difficile qu'il ne le paraît au premier abord, car vous devez tenir compte de jetons des commentaires à l'intérieur de chaînes, jetons des commentaires qui sont eux-mêmes commenté etc.

J'ai écrit une chaîne de caractères et commentaire de l'analyseur pour le C#, permettez-moi de voir si je peux creuser quelque chose qui va vous aider...Je vais mettre à jour si je trouve quoi que ce soit.

EDIT:...ok, donc j'ai trouvé mon vieux " codemasker projet.S'avère que j'ai fait cela dans les stades, pas avec une seule regex.Fondamentalement, je pouces par le biais d'un fichier source à la recherche pour commencer à jetons, quand j'en trouve un, je puis regarder pour un jeton de masque et tout entre les deux.Cela prend en compte le contexte du début jeton...si vous trouvez un jeton pour "string " démarrer", puis vous pouvez en toute sécurité ignorer les commentaires de jetons jusqu'à ce que vous trouver la fin de la chaîne, et vice versa.Une fois que le code est masqué (j'ai utilisé guid comme des masques, et d'une table de hachage pour garder une trace), alors vous pouvez faire en toute sécurité votre recherche et remplacer, puis enfin de restaurer la masqués code.

Espérons que cela aide.

Autres conseils

Soyez particulièrement prudent avec les cordes.Les chaînes ont souvent des séquences d'échappement qui vous avez également à respecter pendant que vous êtes de trouver la fin d'entre eux.

Si par exemple la "This is \"a test\"".Vous ne pouvez pas aveuglément recherchez un double-quote pour terminer.Aussi méfiez-vous des `"C'est \"", ce qui montre que vous ne pouvez pas juste dire "si de double-citation est précédée d'une barre oblique inverse."

En résumé, faire une brutale des tests unitaires!

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

FAQ Perl:

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;

Je voudrais faire une copie et d'en extraire les commentaires d'abord, puis de rechercher la chaîne de la façon habituelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top