Ich versuche, eine Protokolldatei zu analysieren, die wie folgt aussieht:Spiel überlappende Muster mit Fänger einen MATLAB regulären Ausdruck
%%%% 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
...
Dieser Auszug zwei Zeitperioden enthält Ich mag würde zu extrahieren, von den ersten Trennzeichen zum zweiten und vom zweiten zum dritten. Ich möchte einen regulären Ausdruck verwenden, um die Start- und Stoppzeiten für jedes dieser Intervalle zu extrahieren. Diese meist funktioniert:
p = '%{4} (?<start>.*?)\n% Starting (?<name>.*?)\n.*?%{4} (?<stop>.*?)\n';
times = regexp(c,p,'names');
Rückkehr:
times =
1x16 struct array with fields:
start
name
stop
Das Problem ist, dass diese erfasst nur jede zweite Periode, da der zweite Begrenzer als Teil des ersten Spiels verbraucht wird.
In anderen Sprachen können Sie Lookaround-Operatoren (Lookahead, Lookbehind) verwenden, um dieses Problem zu lösen. Die documentation on regular expressions erklärt, wie diese in MATLAB funktionieren, aber ich konnte diese nicht ausführen, während die Matches noch erfasst wurden. Das heißt, ich muss nicht nur jedes Trennzeichen abgleichen können, sondern auch einen Teil dieser Übereinstimmung (den Zeitstempel) extrahieren.
Ist das möglich?
P.S. Mir ist klar, dass ich dieses Problem lösen kann, indem ich eine einfache Zustandsmaschine schreibe oder indem ich die Begrenzer und die Nachbearbeitung anpasse, wenn es keine Möglichkeit gibt, dies zum Laufen zu bringen.
Update: Vielen Dank für die Workaround-Ideen, alle. Ich habe vom Entwickler gehört und es gibt derzeit keine Möglichkeit, dies mit der regulären Ausdrucksmethode in MATLAB zu tun.
Wie sieht die letzte Zeile der Protokolldatei aus? Wird es eine "%%%% ..." Zeile mit nichts danach sein, oder hört es mit dem vorherigen zu ignorierenden Zeug auf? – gnovice
Alle Begrenzerzeilen sehen gleich aus, so dass der letzte einen Zeitstempel enthält und Sie wissen lassen, wann die letzte Periode beendet wurde. Nach dem letzten Trennzeichen müssen weitere Zeilen ignoriert werden. –