2009-05-13 6 views
4

Est-il possible d'inclure */dans un commentaire de bloc de style C? Changer le commentaire de bloc à une série de commentaires de ligne (//) n'est pas une option dans ce cas.Y compris */dans un commentaire de bloc de style C

Voici un exemple du genre de commentaire causant un problème:

/** 
* perl -pe 's/(?<=.{6}).*//g' : Limit to PID 
*/ 
+0

Dans cet exemple particulier, il y a bien sûr beaucoup d'autres façons d'écrire des expressions régulières équivalentes ou des commandes équivalentes qui ne nécessiteraient pas cette combinaison de caractères. –

+0

@Reb Kennedy: Vous avez raison, mais il semble stupide de modifier la fonctionnalité juste pour qu'elle rentre dans un commentaire. – Whatsit

+0

Merci d'avoir posé cette question. la réponse acceptée est une véritable révélation. – Cyberherbalist

Répondre

24

Habituellement, les commentaires n'ont pas besoin d'être littéraux, donc cela n'arrive pas trop souvent.

Vous pouvez envelopper le tout dans un bloC#if:

#if 0 
whatever you want can go here, comments or not 
#endif 
+0

Pretty sneaky! :-) – mquander

+1

Cela ressemble à un tel abus des commandes du préprocesseur, mais il fait le travail. – Whatsit

+6

Il vient avec le territoire. C a été fait pour être abusé. –

10

Non! Il n'y a pas.

+1

Parfois, les réponses simples sont les meilleurs – JaredPar

2

Dans le cas général, vous ne pouvez pas.

Voici une réponse délicate qui arrive à travailler dans ce cas:

/** 
* perl -pe 's/(?<=.{6}).* //gx' : Limit to PID 
*/ 

Ceci est (ou devrait être, je ne teste pas réellement la commande perl) une expression régulière qui correspond à la même chose que l'original, car le modificateur x permet d'utiliser des espaces pour plus de clarté dans l'expression, ce qui permet de séparer le * du /.

Vous pourriez utiliser plus d'espaces, j'ai inclus juste l'espace unique qui casse la fin du jeton de bloc de commentaire.

Certains compilateurs prennent en charge une option permettant d'activer la fonctionnalité non standard d'autoriser les commentaires imbriqués. Ceci est généralement une mauvaise idée, mais dans ce cas particulier, vous pouvez également faire

/** 
* /* perl -pe 's/(?<=.{6}).*//g' : Limit to PID 
*/ 

avec cette option activée pour ce fichier source. Bien sûr, comme démontré par la coloration funky dans le fragment ci-dessus, le reste de vos outils peuvent ne pas savoir ce que vous faites et fera des suppositions incorrectes.

3

Vous pouvez contourner le problème en masquant votre expression régulière pour ne pas inclure la séquence de caractères incriminée. Des regards de ce que vous faites, cela devrait devrait fonctionner (faire le * non gourmand):

/** 
* perl -pe 's/(?<=.{6}).*?//g' : Limit to PID 
*/ 
+0

Est-ce que cette question C va se transformer en une session JAPH? ;-) – RBerteig

+0

+1 pour une autre solution perl intelligente, soit dit en passant. – RBerteig

0

Pour ce cas précis, vous pouvez change the delimiter sur votre perl regex. Vous pouvez utiliser n'importe quel délimiteur non alphanumérique et non-espace. Ici, je suis passé à #:

/** 
* perl -pe 's#(?<=.{6}).*##g' : Limit to PID 
*/ 

choix communs sont # et %.

« caractères bracketing » comme parens ou accolades obtenir une syntaxe légèrement différente, car ils devraient être pairies:

/** 
* perl -pe 's[(?<=.{6}).*][]g' : Limit to PID 
*/ 
Questions connexes