Je suis en train d'analyser un fichier journal qui ressemble à ceci:correspondent à des modèles qui se chevauchent avec la capture en utilisant une expression régulière Matlab
%%%% 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
...
Cet extrait contient deux périodes de temps, je voudrais extraire, de la première délimiteur à la seconde, et de la seconde à la troisième. J'aimerais utiliser une expression régulière pour extraire les heures de début et de fin de chacun de ces intervalles. Cela fonctionne la plupart du temps:
p = '%{4} (?<start>.*?)\n% Starting (?<name>.*?)\n.*?%{4} (?<stop>.*?)\n';
times = regexp(c,p,'names');
retour:
times =
1x16 struct array with fields:
start
name
stop
Le problème est que ce ne capture que tous les temps, depuis le deuxième delimiter est consommé dans le cadre du premier match. Dans d'autres langues, vous pouvez utiliser des opérateurs de lookaround (lookahead, lookbehind) pour résoudre ce problème. Le documentation on regular expressions explique comment cela fonctionne dans MATLAB, mais je n'ai pas réussi à les faire fonctionner tout en capturant les matchs. C'est-à-dire que je dois non seulement être capable de faire correspondre chaque délimiteur, mais aussi que j'ai besoin d'extraire une partie de cette correspondance (l'horodatage).
Est-ce possible?
P.S. Je me rends compte que je peux résoudre ce problème en écrivant une machine d'état simple ou en faisant correspondre les délimiteurs et le post-traitement, s'il n'y a aucun moyen de faire fonctionner cela.
Mise à jour: Merci pour les idées de contournement, tout le monde. J'ai entendu parler du développeur et il n'y a actuellement aucun moyen de le faire avec le moteur d'expressions régulières dans MATLAB.
À quoi ressemblera la dernière ligne du fichier journal? Est-ce que ce sera une ligne "%%%% ..." sans rien après, ou est-ce qu'elle se termine par les choses précédentes à ignorer? – gnovice
Toutes les lignes de délimitation se ressemblent, donc la dernière inclut un horodatage et vous permet de savoir quand la dernière période s'est terminée. Il y a des lignes supplémentaires à ignorer après le dernier délimiteur. –