Как удалить конечные комментарии через регулярные выражения?

Для не разбирающихся в MATLAB читателей: не уверен, к какому семейству они принадлежат, но описаны регулярные выражения MATLABВот в деталях. Символ комментария MATLAB% (процентов) и его разделитель строк' (апостроф). Строковый разделитель внутри строки записывается как двойной апостоф ('this is how you write "it''s" in a string.'). Чтобы усложнить ситуацию, матричные операторы транспонированиятакже апострофы (A' (Эрмитов) илиA.' (Обычный)).

Теперь по темным причинам (что я будуне подробнее :), я пытаюсь интерпретировать код MATLAB на собственном языке MATLAB.

В настоящее время я пытаюсь удалить все завершающие комментарии в массиве ячеек строк, каждый из которых содержит строку кода MATLAB. На первый взгляд это может показаться простым:

>> str = 'simpleCommand(); % simple trailing comment';
>> regexprep(str, '%.*

Но, конечно, может случиться что-то подобное:

>> str = ' fprintf(''%d%*c%3.0f\n'', value, args{:}); % Let''s do this! ';
>> regexprep(str, '%.*

Очевидно, что мы должны исключить все символы комментария, которые находятся внутри строк, из совпадения, учитывая также, что один апостроф (или точка-апострот), следующий непосредственно за оператором, являетсяоператор, а не разделитель строк.

Исходя из предположения, что количество открывающих / закрывающих символов строкидо символ комментария должен бытьчетный (что, как я знаю, является неполным из-за оператора транспонирования матрицы), я вызвал следующее динамическое регулярное выражение для обработки такого случая:

>> str = {
       'myFun( {''test'' ''%''}); % let''s '                 
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % it''s '        
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % let''s '       
       'sprintf(str, ''%*8.0f%*s%c%3d\n'');  '
       'A = A.'';%tight trailing comment'
   };
>> 
>> C = regexprep(str, '(^.*)(?@mod(sum(\1==''''''''),2)==0;)(%.*$)', '$1')

Тем не мение,

C = 
    'myFun( {'test' '%'}); '              %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c'           %// FAIL
    'A = A.';'                            %// success (although I'm not sure why)

так что япочти есть, но еще не совсем :)

К сожалению, я исчерпал количество времени, которое могу потратить на размышления об этом и должен продолжать заниматься другими делами, поэтому, возможно, кто-то, у кого больше времени, достаточно дружелюбен, чтобы подумать над этими вопросами:

Являются ли символы комментария внутри строктолько исключение мне нужно высматривать?Какой правильный и / или более эффективный способ сделать это?, '') ans = simpleCommand();

Но, конечно, может случиться что-то подобное:

>> str = ' fprintf(''%d%*c%3.0f\n'', value, args{:}); % Let''s do this! ';
>> regexprep(str, '%.*$', '') 
ans = 
    fprintf('        %//   <-- WRONG!

Очевидно, что мы должны исключить все символы комментария, которые находятся внутри строк, из совпадения, учитывая также, что один апостроф (или точка-апострот), следующий непосредственно за оператором, являетсяоператор, а не разделитель строк.

Исходя из предположения, что количество открывающих / закрывающих символов строкидо символ комментария должен бытьчетный (что, как я знаю, является неполным из-за оператора транспонирования матрицы), я вызвал следующее динамическое регулярное выражение для обработки такого случая:

>> str = {
       'myFun( {''test'' ''%''}); % let''s '                 
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % it''s '        
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % let''s '       
       'sprintf(str, ''%*8.0f%*s%c%3d\n'');  '
       'A = A.'';%tight trailing comment'
   };
>> 
>> C = regexprep(str, '(^.*)(?@mod(sum(\1==''''''''),2)==0;)(%.*$)', '$1')

Тем не мение,

C = 
    'myFun( {'test' '%'}); '              %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c'           %// FAIL
    'A = A.';'                            %// success (although I'm not sure why)

так что япочти есть, но еще не совсем :)

К сожалению, я исчерпал количество времени, которое могу потратить на размышления об этом и должен продолжать заниматься другими делами, поэтому, возможно, кто-то, у кого больше времени, достаточно дружелюбен, чтобы подумать над этими вопросами:

Являются ли символы комментария внутри строктолько исключение мне нужно высматривать?Какой правильный и / или более эффективный способ сделать это?, '') ans = fprintf(' %// <-- WRONG!

Очевидно, что мы должны исключить все символы комментария, которые находятся внутри строк, из совпадения, учитывая также, что один апостроф (или точка-апострот), следующий непосредственно за оператором, являетсяоператор, а не разделитель строк.

Исходя из предположения, что количество открывающих / закрывающих символов строкидо символ комментария должен бытьчетный (что, как я знаю, является неполным из-за оператора транспонирования матрицы), я вызвал следующее динамическое регулярное выражение для обработки такого случая:

>> str = {
       'myFun( {''test'' ''%''}); % let''s '                 
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % it''s '        
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % let''s '       
       'sprintf(str, ''%*8.0f%*s%c%3d\n'');  '
       'A = A.'';%tight trailing comment'
   };
>> 
>> C = regexprep(str, '(^.*)(?@mod(sum(\1==''''''''),2)==0;)(%.*$)', '$1')

Тем не мение,

C = 
    'myFun( {'test' '%'}); '              %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c'           %// FAIL
    'A = A.';'                            %// success (although I'm not sure why)

так что япочти есть, но еще не совсем :)

К сожалению, я исчерпал количество времени, которое могу потратить на размышления об этом и должен продолжать заниматься другими делами, поэтому, возможно, кто-то, у кого больше времени, достаточно дружелюбен, чтобы подумать над этими вопросами:

Являются ли символы комментария внутри строктолько исключение мне нужно высматривать?Какой правильный и / или более эффективный способ сделать это?, '') ans = simpleCommand();

Но, конечно, может случиться что-то подобное:

>> str = ' fprintf(''%d%*c%3.0f\n'', value, args{:}); % Let''s do this! ';
>> regexprep(str, '%.*$', '') 
ans = 
    fprintf('        %//   <-- WRONG!

Очевидно, что мы должны исключить все символы комментария, которые находятся внутри строк, из совпадения, учитывая также, что один апостроф (или точка-апострот), следующий непосредственно за оператором, являетсяоператор, а не разделитель строк.

Исходя из предположения, что количество открывающих / закрывающих символов строкидо символ комментария должен бытьчетный (что, как я знаю, является неполным из-за оператора транспонирования матрицы), я вызвал следующее динамическое регулярное выражение для обработки такого случая:

>> str = {
       'myFun( {''test'' ''%''}); % let''s '                 
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % it''s '        
       'sprintf(str, ''%*8.0f%*s%c%3d\n''); % let''s '       
       'sprintf(str, ''%*8.0f%*s%c%3d\n'');  '
       'A = A.'';%tight trailing comment'
   };
>> 
>> C = regexprep(str, '(^.*)(?@mod(sum(\1==''''''''),2)==0;)(%.*$)', '$1')

Тем не мение,

C = 
    'myFun( {'test' '%'}); '              %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c%3d\n'); '  %// sucess
    'sprintf(str, '%*8.0f%*s%c'           %// FAIL
    'A = A.';'                            %// success (although I'm not sure why)

так что япочти есть, но еще не совсем :)

К сожалению, я исчерпал количество времени, которое могу потратить на размышления об этом и должен продолжать заниматься другими делами, поэтому, возможно, кто-то, у кого больше времени, достаточно дружелюбен, чтобы подумать над этими вопросами:

Являются ли символы комментария внутри строктолько исключение мне нужно высматривать?Какой правильный и / или более эффективный способ сделать это?

Ответы на вопрос(5)

Ваш ответ на вопрос