Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Delphi Xe中使用正则表达式和rawbytestring_Regex_Delphi_Delphi Xe3 - Fatal编程技术网

Regex 在Delphi Xe中使用正则表达式和rawbytestring

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); 但不是成功。 我试

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

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 AFAIR
TPerlRegEx
,如
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);