Как удалить конечные комментарии через регулярные выражения?
Для не разбирающихся в 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)
так что япочти есть, но еще не совсем :)
К сожалению, я исчерпал количество времени, которое могу потратить на размышления об этом и должен продолжать заниматься другими делами, поэтому, возможно, кто-то, у кого больше времени, достаточно дружелюбен, чтобы подумать над этими вопросами:
Являются ли символы комментария внутри строктолько исключение мне нужно высматривать?Какой правильный и / или более эффективный способ сделать это?