2

在我的项目中,我需要使用正则表达式在 400mb TMemoryStream 对象中查找一些数据。我正在检查 delphi xe3 中的新正则表达式,但函数仅与接收到的字符串参数匹配,而不是 rawbytestring 或指针。我以这种方式定义了模式:

MyPatt:="\x8A\x8A(..)\x8A"

问题是如何在我尝试使用的二进制原始数据中找到

TRegex.Match((MyStreamObject.Memory)^,MyPatt);

但没有成功。我尝试这样做,但也没有成功

TRegex.Match(String((MyStreamObject.Memory)^),MyPatt);

bcz 问题是如果以 0x00 开头的 rawbinary 对象被截断。

我如何使用指针或 rawbinarystring 匹配正则表达式?

4

1 回答 1

6

您可以直接使用 RegEx 库 API 而不是基于字符串的 Delphi 类,后者存在一些已识别(且未修复)的性能问题

例如(兼容 Delphi 6 到 XE5):

uses
{$ifdef ISDELPHIXE}
  // use direct PCRE library as available since Delphi XE
  RegularExpressionsAPI,
{$else}
  // download from http://www.regular-expressions.info/download/TPerlRegEx.zip
  PCRE,
{$endif}
  SysUtils,
  ...

var
  compiled: PPCRE;
  extra: PPCREExtra;
  errMsg: PAnsiChar;
  errPos: integer;

  // here regexp points to your null-terminated regular expression
  compiled := pcre_compile(PAnsiChar(regexp),0,@errMsg,@errPos,nil);
  if reg=nil then begin
    CompileError;
    exit;
  end;
  extra := pcre_study(compiled,0,@errMsg);

  // now use the compiled pcre expression (once compiled, it is better to re-use compiled/extra values)
  found := pcre_exec(compiled,extra,pointer(text),StrLen(text),0,PCRE_NO_UTF8_CHECK,nil,0)>=0;

  // do not forget to release the compiled pcre expression
  pcre_dispose(compiled,extra,nil);

此代码将比TRegEx(以及它从string到 UTF-8 的转换)快得多,并且TPerlRegEx如中定义的那样RegularExpressionsCore.pas(没有这样设置PCRE_NO_UTF8_CHECK非常慢)。

您可以在SQLite3单元的 REGEXP 运算符中找到上述示例的原始代码。

于 2013-10-10T06:15:57.540 回答