Для читателей, не относящихся к MATLAB: не уверен, в какую семью они принадлежат, но регулярные выражения MATLAB описаны полностью here. Характер комментария MATLAB: %
(процент), а его разделитель строк - '
(апостроф). Строковый разделитель внутри строки записывается как двойной апостоф ('this is how you write "it''s" in a string.'
). Чтобы усложнить дело, операторы транспонирования матриц равны также апострофы (A'
(эрмиты) или A.'
(обычные)).Как удалить завершающие комментарии через regexp?
Теперь, по темным причинам (я буду не уточнить :): Я пытаюсь интерпретировать код MATLAB на собственном языке MATLAB.
В настоящее время я пытаюсь удалить все завершающие комментарии в массиве ячеек строк, каждый из которых содержит строку кода MATLAB. На первый взгляд это может показаться простым:
>> str = 'simpleCommand(); % simple trailing comment';
>> regexprep(str, '%.*$', '')
ans =
simpleCommand();
Но, конечно же, что-то подобное может прийти:
>> str = ' fprintf(''%d%*c%3.0f\n'', value, args{:}); % Let''s do this! ';
>> regexprep(str, '%.*$', '')
ans =
fprintf(' %// <-- WRONG!
Очевидно, что нам нужно исключить все символы комментария, которые находятся внутри строки из матча , а также принимая во внимание, что один апостроф (или dot-aposrotphe), непосредственно следуя за оператором, является оператором , а не разделителем строк.
Исходя из предположения, что сумма открытия строки/закрытие символов до того комментария персонаж должен быть даже (который я знаю, является неполным, так как оператор матричного транспонирования), я ассоциировалась следующей динамикой регулярное выражение для обработки такого рода случай:
>> 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, '(^.*)([email protected](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)
так что я почти там, но еще не совсем :)
К сожалению, я исчерпал количество времени, которое могу потратить на размышления об этом, и вам нужно продолжить с другими вещами, поэтому, возможно, кто-то, у кого больше времени, достаточно дружелюбен, чтобы думать о эти вопросы:
- является комментарий символов внутри строку исключения в только мне нужно остерегаться?
- Каков правильный и/или более эффективный способ сделать это?
Я не знаю, что такое matlab, но как насчет использования не жадного квантификатора: '%. *? $' – Toto
@ M42: ну, похоже, это исправляет проблему, по крайней мере для мой маленький подмножество тестов ... Можете ли вы опубликовать ответ? –
@ M42: не ждать, я не выглядел достаточно близко - это * не * исправляет проблему ... на самом деле, она больше ничего не делает :) –