Ваш подход с использованием регулярных выражений слишком сложный и сложный. Вы пытаетесь использовать обычный язык (регулярные выражения) для анализа ситуации, которая по меньшей мере столь же сложна, как и контекстно-свободная грамматика. Если вы разделите вещи и сделаете часть обработки в C ++, вы это сделаете, но это будет выглядеть грязно.
Если ваша цель состоит в том, чтобы написать функцию, которая удаляет все комментарии, не теряя символы новой строки, я предлагаю вам выполнить синтаксический анализ, используя один из многих доступных инструментов синтаксического анализа.
Это заняло менее 5 минут, чтобы создать и функционально то, что вы ищете. Вы можете изменить это по своему усмотрению. Он сгенерирует лексер с flex 2.5.4 или flex 2.5.35
%{
#include <stdio.h>
%}
cbeg "/*"
cend "*/"
cppc "//"
nl "\n"|"\r\n"
%option noyywrap
%x mlc
%%
{nl} { fputs(yytext, stdout); }
{cbeg} { BEGIN(mlc); }
{cend} { fprintf(stderr, "Error: found end of comment without a beginning\n"); return -1; }
{cppc}.* /* eat up the comment */
. { fputs(yytext, stdout); }
<mlc>{cend} { BEGIN(INITIAL); }
<mlc>{cbeg} { fprintf(stderr, "Error: Found /* inside another /* comment"); return -1; }
<mlc>. /* eat up everything else */
%%
int main(int argc, char* argv[])
{
yylex();
}
Добавление:
Выше приведена полнофункциональная программа. Вы можете создать .c используя:
flex -t foo.l > foo.c
и вы можете скомпилировать его, используя
cc -o foo foo.c
Теперь что-то вроде
./foo < source.c > source-sans-comments.c
создаст новый исходный файл.