在Delphi Xe中使用带有rawbytestring的Regex

时间:2013-10-10 03:10:14

标签: regex delphi delphi-xe3

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

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

问题是如何在二进制rawdata中找到它 我试过

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

但不成功。 我试着用这个而不是成功

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

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

如何使用pointer或rawbinarystring匹配正则表达式。?

1 个答案:

答案 0 :(得分:6)

您可以直接使用RegEx库API而不是基于字符串的Delphi类,它们有一些identified (and not fixed) performance issues

例如(与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(以及从TPerlRegEx转换为UTF-8)和RegularExpressionsCore.pas快得多PCRE_NO_UTF8_CHECK(未设置{ {1}}所以非常慢。)

您可以找到上述示例in our REGEXP operator for SQLite3 unit的原始代码。