Я работаю над подпрограммой, чтобы разделить блок или комментарии линии от некоторого кода C#. Я просмотрел другие примеры на сайте, но не нашел точный ответ, который я ищу.Regex to strip line comments from C#
я могу соответствовать блочные комментарии (/ * комментарий * /) в полном объеме, используя это регулярное выражение с RegexOptions.Singleline:
(/\*[\w\W]*\*/)
И я могу соответствовать комментарии строки (комментарий), // в их цельность, используя это регулярное выражение с 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
Кроме того, если у меня нет */положительный предпросмотр в выражении линии дважды, он соответствует
// do not remove nested comments *
который я действительно не хочу.
То, что я хочу, это выражение, которое будет соответствовать символы, начиная с //
, до конца строки, но делает не содержат */
между //
и концом строки.
Кроме того, чтобы удовлетворить мое любопытство, может ли кто-нибудь объяснить, почему мне нужен взгляд дважды? (//((?!\*/).)*)[^\r\n]
и (//(.)*)(?!\*/)[^\r\n]
оба будут включать *, но (//((?!\*/).)*)(?!\*/)[^\r\n]
и (//((?!\*/).)*(?!\*/))[^\r\n]
не будут.
Вы также рассмотрели случай, когда 'string foo =" http://stackoverflow.com; "' –
Ваши шаблоны '/ * ... * /' из-за жадности, например. рассмотрим '/ * комментарий1 */not-a-comment!/* комментарий2 */'. – polygenelubricants
Возможно, вы можете использовать синтаксический анализатор для C#: http://stackoverflow.com/questions/81406/parser-for-c – TrueWill