regexp长度取决于内容

时间:2015-09-30 14:47:32

标签: regex matlab vectorization

背景:我正在使用MATLAB并打开带有ASCII文本表示的长十六进制字符串的大文件。 MATLAB脚本根据模式解释此文本。我已成功利用bsxfun,cellfun和arrayfun与正则表达式来解析大块数据并删除我不需要/想要的部分。现在,我要了解我真正需要的数据。问题是,模式,特别是模式长度,取决于我解码的模式内部的值。

以下是我的基本构建模块:

hexcharpat = '([0-9A-F])';
hexbytepat = ['(' hexcharpat '{2})'];

Hexcharpat是一个单一的十六进制字符。 Hexbytepat是两个十六进制字符,或一个字节的信息。

现在从这些构建块中,我正在搜索数据以匹配其他各种模式。其中许多模式都依赖于同一模式中的数据。这是一个示例模式(注意:我使用...来分隔行,因此我的所有模式都遵循相同的基本格式):

    pattern3 = [ ...
                 '(?<patnum>03)' ... 
                 '(?<numbytes>' hexbytepat '{1})' ...
                 '(?<data>' hexbytepat '{1,125})' ... 
               ];

   returnvalues = regexp(datastr,pattern3);

(为了重点和清晰度,删除了bsxfun调用)

返回值是一个包含成员patnumnumbytesdata(正则表达式标记)的结构。在当前模式中,data可以是1到125个字节。这导致我的data令牌拥有的数据超出其实际拥有的数量。实际上,data的长度等于hex2dec(numbytes)

然后根据返回值结构中的成员和值填充表。

我想我可以&#34;蛮力&#34;通过这样做,让data过大,制作一个表格列以放入numbytes(这将是一个&#34;帮助列&#34;因为我否则不在乎关于此值)然后使用另一个正则表达式重新访问data列并根据numbytes列的值进一步拆分,然后在脚本中放弃我不再需要的列。

以上所有都会花费处理器时间和内存空间(在非常大的文件上,我可能会耗尽内存)。我还需要做一些关于&#34; tail&#34;被截断的数据可能包含其他模式的字节。是否优雅&#34;使用单个正则表达式(或者两个,而不必在其间创建大量变量)来实现此目的的方法?

注意:如果可以在regexp中完成,不包括如何在bsxfun,cellfun和arrayfun中使用,我会对它们进行排序。假装我想把这个regexp变成一行(或者两个),并且出于某种原因,添加更多的行将花费我很多处理器时间(如果我必须重复调用一个或多个提到的函数,它可以) 。当然,在这些函数中可能有一种方法可以使用其他东西 - 所以如果它需要在上下文中显示,那就去吧。

0 个答案:

没有答案