onig.dllの使い方

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)

例1:コピーライト表示
例1:コピーライト表示
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.
例2:最小使用例
例2:最小使用例
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.