Regex 在Delphi Xe中使用正则表达式和rawbytestring
在我的项目中,我需要使用正则表达式来查找400mb TMemoryStream对象中的一些数据。Iam正在delphi xe3中检查新的RegularExpression,但函数仅与接收到的字符串参数匹配,而不与rawbytestring或指针匹配。 我以这种方式定义了模式ok:Regex 在Delphi Xe中使用正则表达式和rawbytestring,regex,delphi,delphi-xe3,Regex,Delphi,Delphi Xe3,在我的项目中,我需要使用正则表达式来查找400mb TMemoryStream对象中的一些数据。Iam正在delphi xe3中检查新的RegularExpression,但函数仅与接收到的字符串参数匹配,而不与rawbytestring或指针匹配。 我以这种方式定义了模式ok: MyPatt:="\x8A\x8A(..)\x8A" 问题是如何在二进制rawdata中查找 我试着 TRegex.Match((MyStreamObject.Memory)^,MyPatt); 但不是成功。 我试
MyPatt:="\x8A\x8A(..)\x8A"
问题是如何在二进制rawdata中查找
我试着
TRegex.Match((MyStreamObject.Memory)^,MyPatt);
但不是成功。
我试过了,但也没有成功
TRegex.Match(String((MyStreamObject.Memory)^),MyPatt);
bcz问题是以0x00开头的rawbinary对象是否被截断
如何使用指针或rawbinarystring匹配regex表达式?您可以直接使用regex库API,而不是基于字符串的Delphi类,它们具有一些特性 例如(与Delphi 6至XE5兼容): 此代码将比
TRegEx
(及其从string
到UTF-8的转换)和TPerlRegEx
快得多,如RegularExpressionsCore.pas
中所定义(它不设置PCRE NO\U UTF8检查
所以速度非常慢)
您可以找到上述示例的原始代码。我建议您在问题中删去最后一行“任何想法,或任何可以帮助我的现有库?”,因为您已经在上一句中提出了问题,而“现有库”与主题无关。很抱歉,我对这个主题不太熟悉,无法提供答案。@Jerrydoge,谢谢你的旅行,编辑的主要帖子。你应该使用
RegularExpressionsCore
单元,因为它使用UTF8。引用自:“如果您正在处理UTF-8数据,请使用RegularExpressionsCore单元以避免不必要的UTF-8到UTF-16到UTF-8转换。”
@LURD AFAIRTPerlRegEx
,如RegularExpressionsCore.pas
中所定义的那样,速度非常慢。它硬编码选项PCRE_UTF8或PCRE_NEWLINE_ANY
。@ArnaudBouchez您能否帮助演示(1)如何“重用已编译”(2)当直接使用正则表达式库API时如何使用“命名组”功能?(1)在另一个文本(2)上使用相同的已编译额外参数再次调用PCRE_exec()“对不起,我没有显示此功能的代码,因为我没有使用它。”DavidHeffernan OP写了大约400 MB的文本。在这里,性能肯定是一个问题。我并不迷恋性能(这是万恶之源),但如果我能在不增加额外成本的情况下更快地完成某件事,我会去做。RTL包装器速度慢的不仅仅是UTF-8转换,更重要的是PCRE执行选项是硬编码的,并且没有设置PCRE\u no\u UTF8\u CHECK
,请查看我的链接和。还是。我怀疑表现对教统局来说并不重要——他们可能会写下与你相同的评论:表现根本不相关。在400 MB文件上:速度提高1000倍是相关的:@DavidJesus我并没有深入研究PCRE以了解它是否支持空字符。我想\x0或\000可以。
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);