您可以直接使用 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 运算符中找到上述示例的原始代码。