2013-10-10 3 views
2

В моем проекте мне нужно использовать регулярное выражение для поиска некоторых данных в объекте TMemoryStream размером 400 Мб. Я проверяю новое regularexpresion внутри delphi xe3, но функция соответствует только полученным строковым параметрам, а не rawbytestring или указателю. Я определил рисунок на этом пути ок:Использование Regex в Delphi Xe с rawbytestring

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

Проблема заключается в том, как найти в двоичном RAWDATA Я tryied с

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

, но не успеха. я стараюсь с этим и не Sucess слишком

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

BCZ проблема, если rawbinary объект начинаются с 0x00 обрезано.

Как я могу сопоставить выражение регулярных выражений с помощью указателя или rawbinarystring.?

+1

Я бы предложил оставить эту последнюю строку в вашем вопросе «Любая идея или любая существующая библиотека, которая может мне помочь?» потому что вы уже задали свой вопрос в предыдущем предложении, а «существующие библиотеки» - вне темы. Извините, я не знаком с предметом, чтобы дать ответ. –

+0

@JerryDodge, Спасибо за поездку, главный пост отредактирован. –

+1

Вы должны использовать блок 'RegularExpressionsCore', поскольку он использует UTF8. Цитата из ['help'] (http://www.regular-expressions.info/delphi.html):' 'Если вы имеете дело с данными UTF-8, используйте модуль RegularExpressionsCore, чтобы избежать ненужных UTF-8 до UTF -16 до UTF-8. ". –

ответ

6

Вы можете напрямую использовать API библиотеки RegEx вместо строковых классов 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 в UTF-8) и TPerlRegEx, как определено в RegularExpressionsCore.pas (который не устанавливается PCRE_NO_UTF8_CHECK, так что очень медленно).

Вы можете найти исходный код вышеуказанного образца in our REGEXP operator for SQLite3 unit.

+1

Что заставляет вас думать о производительности? –

+0

@ArnaudBouchez Не могли бы вы помочь показать (1), как «повторно использовать скомпилированные» (2) как использовать функцию «named group», когда API библиотеки RegEx используется напрямую? – SOUser

+1

(1) снова вызовите pcre_exec() с теми же скомпилированными дополнительными параметрами, на другой текст (2) У меня нет кода для показа этой функции, так как я не использую ее, извините. –

Смежные вопросы