Delphi 2009から鬼車(正規表現ライブラリ)を動的リンクで使用する方法です。鬼車の作者である K.Kosako 氏は無関係ですので、作者に迷惑をかけないようにしてください。
【ver 5.9.1】 Oniguruma.pas (2009.01.12), Onig.pas (2006.11.15), onig.zip (2008.11.24, 108KB, Microsoft Visual C++ 2008 Express Editionでビルドしたonig.dll)
program sample_copyright;
{$APPTYPE CONSOLE}
uses
SysUtils,
Onig in 'Onig.pas',
Oniguruma in 'Oniguruma.pas';
begin
try
if OnigLoadLibrary then
begin
Writeln(onig_copyright);
OnigFreeLibrary;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
program sample_simple;
{$APPTYPE CONSOLE}
uses
SysUtils,
Onig in 'Onig.pas',
Oniguruma in 'Oniguruma.pas';
var
r, i: Integer;
start, range, str_end: PChar;
reg: OnigRegex;
einfo: OnigErrorInfo;
region: POnigRegion;
syntax_default: ^POnigSyntaxType;
s: AnsiString;
mbeg, mend: PIntegerArray;
const
pattern: PChar = 'a(.*)b|[e-f]+';
str: PChar = 'zzzzaffffffffb';
begin
try
if not OnigLoadLibrary then Exit;
syntax_default := @ONIG_SYNTAX_DEFAULT;
r := onig_new(@reg, POnigUChar(pattern), POnigUChar(StrEnd(pattern)),
ONIG_OPTION_DEFAULT, @ONIG_ENCODING_UTF16_LE, syntax_default^, @einfo);
if r <> ONIG_NORMAL then
begin
SetLength(s, ONIG_MAX_ERROR_MESSAGE_LEN);
onig_error_code_to_str(POnigUChar(s), r, @einfo);
Writeln(Format('ERROR: %s', [s]));
Exit;
end;
region := onig_region_new;
str_end := StrEnd(str);
start := str;
range := str_end;
r := onig_search(reg, POnigUChar(str), POnigUChar(str_end),
POnigUChar(start), POnigUChar(range), region, ONIG_OPTION_NONE);
if r >= 0 then
begin
mbeg := PIntegerArray(region.match_beg);
mend := PIntegerArray(region.match_end);
Writeln(Format('match at %d', [r]));
for i := 0 to region.num_regs - 1 do
Writeln(Format('%d: (%d-%d)', [i, mbeg[i], mend[i]]));
end
else if r = ONIG_MISMATCH then
Writeln('search fail')
else
begin
SetLength(s, ONIG_MAX_ERROR_MESSAGE_LEN);
onig_error_code_to_str(POnigUChar(s), r, @einfo);
Writeln(Format('ERROR: %s', [s]));
end;
onig_region_free(region, 1);
onig_free(reg);
onig_end;
OnigFreeLibrary;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.