Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 使用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 ... 此摘录包含两个我要提取的时间段,从第一个定界符到第二个定界符,从第二个定界符到第三个定界符。我想使用正则表达式提取这些间隔中每个间隔的开始和结束时间。这主要适用于:

p = '%{4} (?.*?)\n% Starting (?.*?)\n.*?%{4} (?.*?)\n'; times = regexp(c,p,'names'); 返回:

times = 1x16 struct array with fields: start name stop 问题在于,这仅捕获其他所有周期,因为第二个定界符在第一次匹配中被消耗。

在其他语言中,可以使用环视运算符(超前,后向)解决此问题。 正则表达式文档说明了它们在MATLAB中的工作方式,但是我仍然无法在捕获匹配项的同时使它们发挥作用。也就是说,我不仅需要能够匹配每个定界符,而且还需要提取该匹配的一部分(时间戳)。

这可能吗?

PS:我意识到我可以通过编写简单的状态机或通过在定界符上进行匹配和后处理来解决此问题,如果没有办法可以使它工作的话。

更新:所有人,感谢您提供解决方法的想法。我收到了开发人员的来信,目前无法通过MATLAB中的正则表达式引擎执行此操作。


回答:
MATLAB似乎无法在不从字符串中删除字符的情况下捕获字符作为令牌(或者,我应该说, 无法使用MATLAB REGEXP来捕获字符)。但是,通过注意到一个文本块的停止时间等于下一个文本块的开始时间,我能够使用REGEXP捕获仅开始时间和名称,然后进行一些简单处理以从文本框中获取停止时间。开始时间。我使用了以下示例文本:

c = %%%% 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 some more junk ...并应用以下表达式:

p = '%{4} (?[^\n]*)\n% Starting (?[^\n]*)[^%]*|%{4} (?[^\n]*).*'; 然后可以使用以下代码完成处理:

names = regexp(c,p,'names'); [names.stop] = deal(names(2:end).start,[]); names = names(1:end-1); ...这为上述示例文本提供了以下结果:

>> names(1) ans = start: '09-May-2009 04:10:29' name: 'foo' stop: '09-May-2009 04:10:50' >> names(2) ans = start: '09-May-2009 04:10:50' name: 'bar' stop: '09-May-2009 04:11:29'

更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:57


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.