在我的项目中,我需要使用正则表达式在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匹配正则表达式。?
答案 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的原始代码。