2005年07月28日

文字列と出現回数から文字列の位置を取得する方法

Delphi標準関数Posを応用した関数です。
指定された文字列から特定の部分文字列を検索し、
検索ヒット回数が指定された回数になった場合、
その部分文字列の文字位置を戻す関数です。

な〜んのことはありません。
Pos関数に検索ヒット回数の引数が追加されただけですが、
この関数を利用する局面は、以外にもたくさんあるのです。

今回ご紹介する関数は、
「文字列からトークンを取得する方法」
などの関数と組み合わせることで、
文脈自由型のコンパイラやインタープリタの文脈解析、
プログラムの挙動を制御するINIファイルの解析など、
幅広い問題の解決にご利用いただけるかと思います。


ではさっそく、プログラムを紹介しましょうね。

_Posソースは【続きを読む】をクリック!

関数仕様
function _Pos(
 pSubStr, pSource: String; pCount: Integer): Integer;
説明
pSourceで指定された文字列から、pSubStrで指定された部分文字列を検索し、検索ヒット回数が指定されたpCountと同じ場合、pSource中の部分文字列の位置を戻します。部分文字列が見つからない場合や、検索ヒット回数の条件を満たさない場合、関数はゼロを戻します。
使用例
procedure TForm1.Button1Click(Sender: TObject);
var
 lText: String;
 lIndex: Integer;
begin
 lText := 'Hello! This is guy. sorry? My Name is guy.';
 // 上記文字列から
 // 1回目にヒットした'guy'の文字位置を取得する。
 // 文字位置は'16'が戻されます。

 lIndex := _Pos('guy', lText, 1);
 Edit1.Text := Format('%d', [lIndex]);
 // 上記文字列から
 // 2回目にヒットした'guy'の文字位置を取得する。
 // 文字位置は'39'が戻されます。

 lIndex := _Pos('guy', lText, 2);
 Edit1.Text := Edit1.Text + Format(',%d', [lIndex]);
 // 上記文字列から
 // 3回目にヒットした'guy'の文字位置を取得する。
 // 文字位置は'0'が戻されます。

 lIndex := _Pos('guy', lText, 0);
 Edit1.Text := Edit1.Text + Format(',%d', [lIndex]);
end;

関連書籍


Copyright guy@かしらもんじ でぇ〜

注意:
 下記ソースファイルは、本ページの管理者である「guy」が個人的に作成しました。
 このソースは作者に断り無く、個人がコピー、改造することは許可しますが、
 いかなる場合であっても、商用目的に使用することを固く禁じます。
 あと、ホームページでの公開の都合上、各ソースの先頭に全角スペースが入ってます。
 あなたがDelphiでコンパイルする前に、この全角スペースを半角スペースに変換してくださいね。

Source: _Pos
function _Pos(pSubStr, pSource: String; pCount: Integer): Integer;
var
 lCnt,
 lPos,
 lOff: Integer;
 lStr: String;
begin
 Result := 0;
 lCnt := 0;
 lOff := 0;
 lStr := pSource;
 while (lStr <> '') do
 begin
  lPos := Pos(pSubStr, lStr);
  if (lPos <= 0) then Break;
  Inc(lCnt);
  if (lCnt = pCount) then
  begin
   Result := lOff + lPos;
   Break;
  end;
  lStr := Copy(lStr, lPos+1, Length(lStr));
  Inc(lOff, lPos);
 end;
end;

posted by guy at 06:59 | 文字列操作編
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。