Je suis en train de travailler sur une routine de bande de bloquer ou de commentaires en ligne à partir d'un code C#. J'ai regardé les autres exemples sur le site, mais n'ai pas trouvé l' exacte réponse que je cherche.
Je peux correspondre à bloquer les commentaires (/* commentaire */) dans leur intégralité à l'aide de cette expression régulière avec RegexOptions.Singleline:
(/\*[\w\W]*\*/)
Et je peux correspondre à la ligne de commentaires (// commentaire) dans leur intégralité à l'aide de cette expression régulière avec RegexOptions.Multiline:
(//((?!\*/).)*)(?!\*/)[^\r\n]
Note: je suis à l'aide d' [^\r\n]
au lieu de $
car $
y \r
dans le match, trop.
Cependant, ce n'est pas tout à fait travailler la façon dont je le veux.
Voici mon code de test que je suis la correspondance contre:
// remove whole line comments
bool broken = false; // remove partial line comments
if (broken == true)
{
return "BROKEN";
}
/* remove block comments
else
{
return "FIXED";
} // do not remove nested comments */ bool working = !broken;
return "NO COMMENT";
Le bloc de l'expression correspond à
/* remove block comments
else
{
return "FIXED";
} // do not remove nested comments */
ce qui est bien et bon, mais la ligne de l'expression correspond à
// remove whole line comments
// remove partial line comments
et
// do not remove nested comments
Aussi, si je n'ai pas l' */ anticipation positif dans la ligne de l'expression deux fois, il correspond à
// do not remove nested comments *
qui j'ai vraiment ne voulez pas.
Ce que je veux, c'est une expression qui correspond à des caractères, en commençant par //
, à la fin de la ligne, mais ne pas contenir */
entre l' //
et à la fin de la ligne.
Aussi, juste pour satisfaire ma curiosité, quelqu'un peut-il expliquer pourquoi j'ai besoin de l'anticipation deux fois? (//((?!\*/).)*)[^\r\n]
et (//(.)*)(?!\*/)[^\r\n]
permettra à la fois d'inclure l' *, mais (//((?!\*/).)*)(?!\*/)[^\r\n]
et (//((?!\*/).)*(?!\*/))[^\r\n]
ne sera pas.