16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"高速文字列検索(BM法)"
この発言に対し以下のコメントが寄せられています
#01374 ぜえた さん RE:高速文字列検索(BM法) Unit 前半
#01375 ぜえた さん RE:高速文字列検索(BM法) Unit 後半
こんにちは、ぜえた です。
Boyer-Moore法を使って文字列検索を行うクラス(TStringSearch)です。
文字列検索で最高速といわれる Boyer-Moore法を一部アセンブリで実装したの
で高速です。
Ansi対応や、大文字小文字を区別しないなどを指定できます。
両方指定すれば、ちゃんと「a」を「A」にマッチします。この場合も
Boyer-Moore法を使っています。普通の Boyer-Moore法ではないですが。
constructor Create(const Pattern: string; Options: TStringSearchOptions);
Patternに検索文字列を指定。
Optionsには (ssAnsi, ssIgnoreCase)の集合を指定。ssAnsiを指定すると
Ansi対応、ssIgnoreCaseを指定すると大文字小文字を区別しなくなりす。
property Search: TStringSearchProc;
プロパティになってますが、
function Search(StrStartm StrEnd: PChar): PChar;
というメソッドだと思ってください。文字列の検索をし、存在したら 先頭ポ
インタ、存在しなかったら nilを返します。
//サンプル
var
Text: string;
Pattern: string;
procedure TForm1.Button1Click(Sender: TObject);
var
SS: TStringSearch;
p, q: PChar;
c: Integer;
begin
Pattern := 'function';
SS := TStringSearch.Create(Pattern, [ssIgnoreCase]);
try
c := 0;
p := PChar(Text);
q := p + Length(Text);
while True do begin
p := SS.Search(p, q);
if p = nil then Break;
Inc(p, Length(Pattern));
Inc(c);
end;
finally
SS.Free;
end;
Caption := IntToStr(c);
end;
//PCharを使いたくない人は FindFirstStringなどラップしたものがいいかも。
procedure TForm1.Button2Click(Sender: TObject);
var
F: TStringSearchRec;
c: Integer;
begin
c := 0;
if FindFirstString(Text, Pattern, [ssIgnoreCase], F) then begin
try
repeat
Inc(c);
until not FindNextString(F);
finally
FindStringClose(F);
end;
end;
Caption := IntToStr(c);
end;
ぜえた (QZC05100)
Original document by ぜえた 氏 ID:(QZC05100)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|