Я работаю над подпрограммой для удаления комментариев из блоков или из некоторого кода C #. Я просмотрел другие примеры на сайте, но не нашел точного ответа, который я ищу.
Я могу сопоставить блочные комментарии (/ * comment * /) полностью, используя это регулярное выражение с RegexOptions.Singleline:
(/\*[\w\W]*\*/)
И я могу сопоставить строковые комментарии (// comment) полностью, используя это регулярное выражение с RegexOptions.Multiline:
(//((?!\*/).)*)(?!\*/)[^\r\n]
Примечание: я использую [^\r\n]
вместо $
, потому что $
также включает в себя \r
в матче.
Однако, это не вполне работает так, как я хочу.
Вот мой тестовый код, с которым я сопоставляю:
// 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";
Соответствует выражению блока
/* remove block comments
else
{
return "FIXED";
} // do not remove nested comments */
это хорошо и хорошо, но выражение строки соответствует
// remove whole line comments
// remove partial line comments
и
// do not remove nested comments
Кроме того, если у меня нет выражения * / positive в выражении строки дважды, это соответствует
// do not remove nested comments *
что я действительно не хочу.
Мне нужно выражение, которое будет сопоставлять символы, начиная с //
, до конца строки, но не содержит */
между //
и концом строки.
Кроме того, просто чтобы удовлетворить мое любопытство, кто-нибудь может объяснить, почему мне нужно смотреть вдаль дважды? (//((?!\*/).)*)[^\r\n]
и (//(.)*)(?!\*/)[^\r\n]
будут включать *, но (//((?!\*/).)*)(?!\*/)[^\r\n]
и (//((?!\*/).)*(?!\*/))[^\r\n]
не будут.