SkRegExp version 1.30 公開

あと、余分なコードを整理して、マイナーバージョンをあげて、来週公開します。

と書いてから、気づけば4ヶ月。

予告より大幅に遅れましたが、ようやく SkRegExp version 1.30 を公開しました。

主な更新内容は以下の通り。

  • 先読み/後読みを最適化しました。ぶっちゃけ、今までは PCRE より遅かったです。
  • 低レベルの文字比較用の関数を導入し、バラバラだった比較方法を整理しました。これにより、ANSI Delphi での処理速度が少しだけ速くなりました。
  • グローバル関数をクラス関数を呼び出すように変更しました。
  • 未使用のクラス、関数を削除しました。
  • TSkRegExp.Groups プロパティをヘルプで公開しました。その関連で、TREGroup、TREGroupCollection の名前をそれぞれ TGroup、TGroupCollection に変更し、ヘルプで公開しました。

今回の修正は多岐にわたりますが、ココまで時間がかかったのはヘルプを書くのに時間がかかったからです。

TSkRegExp クラスの Groups プロパティを公開したので。

このバージョンの更新はコレで最後にしたいと考えています。

今後は、以前お知らせしたように SkRegExp2 の開発に注力します。

“SkRegExp version 1.30 公開” への3件の返信

  1. SkRegExpを使わせていただいています。ありがとうございます。
    バージョン1.3.1(それ以前も同様)で1点修正が必要な点について報告します。
    該当箇所のソースを貼り付けます。
    {$IFDEF KITAMURA}のところになります。
    当方の臨時対応ですので本来あるべき対応ではないかと思います。ご確認いただければと思います。
    function TREMatchEngine.Match(AStr: PWideChar): Boolean;
    var
    P: PWideChar;
    IsCheck: Boolean;
    {$IFDEF KITAMURA}
    P2: PWideChar;
    {$ENDIF}
    begin
    Result := False;
    FStateList := FRegExp.FStateList;
    FGroups := FRegExp.FGroups;
    if FLeadCharMode = lcmLastLiteral then
    begin
    if not FLeadStrings.Exec(AStr, FRegExp.FMatchEndP – AStr) then
    Exit;
    end;
    case FLeadCharMode of
    lcmFirstLiteral:
    begin
    P := AStr;
    if FLeadStrings.Exec(P, FRegExp.FMatchEndP – P) then
    begin
    repeat
    {$IFDEF KITAMURA}
    P2 := P;
    {$ENDIF}
    P := FLeadStrings.MatchP;
    if FIsBehindMatch and
    (FRegExp.FMatchEndP > P + FPreMatchLength) then
    Inc(P, FPreMatchLength)
    else if (FPreMatchLength > 0) and
    (P >= FRegExp.FMatchTopP + FPreMatchLength) then
    Dec(P, FPreMatchLength);
    if MatchEntry(P) then
    begin
    Result := True;
    Exit;
    end;
    {$IFDEF KITAMURA}
    if (P2 P) then begin
    FLeadStrings.FTextLen := FLeadStrings.FTextLen-(P-P2);
    end;
    {$ENDIF}
    until not FLeadStrings.ExecNext;
    end;
    end;
    lcmSimple:
    begin
    if FLeadStrings.Exec(AStr, FRegExp.FMatchEndP – AStr) then
    begin
    Result := True;
    FGroups[0].Capture.StartP := AStr + FLeadStrings.MatchPos – 1;
    FGroups[0].Capture.EndP := FLeadStrings.MatchP +
    Length(FLeadStrings.FindText);
    end;
    end;
    lcmTextTop:
    begin
    if MatchEntry(AStr) then
    begin
    Result := True;
    Exit;
    end;
    end;
    lcmLineTop:
    begin
    while AStr <= FRegExp.FMatchEndP do
    begin
    if MatchEntry(AStr) then
    begin
    Result := True;
    Exit;
    end;
    while not IsLineSeparator(AStr^) and (AStr <= FRegExp.FMatchEndP) do
    Inc(AStr);
    if IsLineSeparator(AStr^) then
    begin
    repeat
    Inc(AStr);
    until not IsLineSeparator(AStr^);
    end
    else
    Break;
    end;
    end;
    else
    begin
    if FLeadCharMode = lcmMap then
    begin
    while AStr <= FRegExp.FMatchEndP do
    begin
    if FMap.IsExists(AStr) then
    begin
    if MatchEntry(AStr) then
    begin
    Result := True;
    Exit;
    end;
    end
    else
    Inc(AStr);
    end;
    end
    else
    begin
    if AStr nil then
    begin
    while AStr <= FRegExp.FMatchEndP do
    begin
    if FLeadCharMode = lcmHasLead then
    IsCheck := IsLeadStrings(AStr)
    else
    IsCheck := True;
    if IsCheck then
    begin
    if MatchEntry(AStr) then
    begin
    Result := True;
    Exit;
    end;
    end
    else
    Inc(AStr);
    end;
    end;
    end;
    end;
    end;
    end;

  2. 北村さん、確認致しました。
    北村さんの修正は、TREQuickSearchクラスで2文字の文字列を検索するときだけに必要な修正です。
    ただし、ご指摘の箇所で修正すると3文字以上の文字列を検索するときに問題になりそうです。
    TREQuickSearchクラス内の修正したバージョンを近く公開致します。
    北村さん、ご指摘ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。