Я пытаюсь разобрать файл журнала, который выглядит следующим образом:
%%%% 09-May-2009 04:10:29
% Starting foo
this is stuff
to ignore
%%%% 09-May-2009 04:10:50
% Starting bar
more stuff
to ignore
%%%% 09-May-2009 04:11:29
...
Этот отрывок содержит два периода времени, которые я хотел бы извлечь: от первого разделителя до второго и от второго до третьего. Я хотел бы использовать регулярное выражение для извлечения времени начала и окончания каждого из этих интервалов. Это в основном работает:
p = '%{4} (?<start>.*?)\n% Starting (?<name>.*?)\n.*?%{4} (?<stop>.*?)\n';
times = regexp(c,p,'names');
Возвращение:
times =
1x16 struct array with fields:
start
name
stop
Проблема в том, что это захватывает только каждый второй период, поскольку второй разделитель используется как часть первого совпадения.
На других языках вы можете использовать операторы обхода (lookahead, lookbehind) для решения этой проблемы. Документация по регулярным выражениям объясняет, как они работают в MATLAB, но я не смог заставить их работать, все еще захватывая совпадения. То есть мне нужно не только иметь возможность сопоставлять каждый разделитель, но и извлекать часть этого совпадения (отметку времени).
Возможно ли это?
P.S. Я понимаю, что могу решить эту проблему, написав простой конечный автомат или сопоставив разделители и постобработку, если нет способа заставить это работать.
Обновление: Спасибо за идеи обходного пути, всем. Я слышал от разработчика, и в настоящее время нет способа сделать это с помощью механизма регулярных выражений в MATLAB.