Scintilla/Searching and Replacing

Last-modified: 2008-03-01 (土) 18:50:36

検索と置換

テキストと正規表現のための検索メソッドがある。
正規表現のサポートは、制限されていて簡単なケースと初期の開発のために使うのみである。

  • SCI_FINDTEXT(int flags, TextToFind *ttf)
  • SCI_SEARCHANCHOR
  • SCI_SEARCHNEXT(int searchFlags, const char *text)
  • SCI_SEARCHPREV(int searchFlags, const char *text)
  • Search and replace using the target

searchFlags

簡単な正規表現検索を含むいくつかの検索ルーチンはフラグオプションを使う。
次に挙げるフラグオプションを組み合わせる:

 

[heart] 表: 検索フラグ

SCFIND_MATCHCASE検索文字列に一致するテキストの場合のみにマッチ
SCFIND_WHOLEWORD前後の文字が単語文字でない場合にのみマッチ
SCFIND_WORDSTART前の文字が単語文字でない場合にのみマッチ
SCFIND_REGEXP検索文字列は正規表現として解釈される
SCFIND_POSIX\(と\)をセクションタグと解釈することで多くのPOSIX互換正規表現に対応する
 

もしSCFIND_REGEXPがsearchFlagsを含んでなければ、あなたは、開始前の検索範囲の最後のときにセットすることによって検索文字列の前の発生を見つけるために後方に探すことができる。
もしSCFIND_REGEXPが含まれていれば、検索範囲が後方にあっても、いつも下位位置から、より高い位置まで検索する。


正規表現では、解釈される特殊文字は以下の通りである:

 

[heart] 表: 正規表現

.文字にマッチ
\(これは、タグ付けのための領域の始まりがマッチであるとマークする。
\)これはタグ付けをされた領域の最後を示す。
\nnは1~9までで、n番目のタグ範囲にマッチした文字列を参照する。
例えば、検索文字列がFred\([1-9]\)XXXで置換文字列がSam\1YYYであるとき、Fred2XXXが与えられるとSam2YYYに置換される。
\<これはScintillaの単語定義で使われる単語の始まりにマッチする。
\>これはScintillaの単語定義で使われる単語の終わりにマッチする。
\x通常は正規表現内で特殊な意味を持つ文字xをその文字そのものとして使う。
たとえば\[は文字集合の開始ではなく単なる[の文字として扱われる。
[...]文字集合を意味する。[abc]はa、b、cのいずれか一文字に合致する。
範囲指定も可能で、[a-z]は全ての小文字一文字にマッチする。
[^...]文字集合の補集合を意味する。
[^A-Za-z]はアルファベット以外の全ての文字一字にマッチする。
^行頭にマッチ (セットの中で使用されない場合、上を見よ)。
$行末にマッチ
*0文字以上にマッチ。たとえばSa*mはSm, Sam, Saam, Saaamなどにマッチする。
+1文字以上にマッチ。たとえばSa+mはSam, Saam, Saaamなどにマッチする。
 

SCI_FINDTEXT(int searchFlags, TextToFind *ttf)

このメッセージはドキュメントのテキストを探す。
それは、現在の選択を使用も動かしもしない。
searchFlags引数は検索タイプを制御する。正規表現検索を含む。


TextToFind構造体はScintilla.hで定義される; ドキュメント検索の範囲でchrg.cpMinとchrg.cpMaxをセットする。
もしSCFIND_REGEXPがフラグに含まれない場合、chrg.cpMinほどchrg.cpMaxを設定しないことによって、後方に探すことができる。
もしSCFIND_REGEXPが含まれる場合、常に前方へ検索する(chrg.cpMaxがchrg.cpMin以下であるなら)。
ゼロ終端テキストでTextToFindのlpstrTextメンバをセットした検索パターンを保持する。
TextToFindの使用があなたの言語で難しくなるなら、代わりにSCI_SEARCHINTARGETを使用すると考えるべきである。


検索が失敗するなら戻り値は-1、成功すれば見つかったテキストの開始位置を返す。
TextToFindのchrgText.cpMinとchrgText.cpMaxメンバーは見つかったテキストの開始および終了位置で埋められる。

[star] 関連項目: SCI_SEARCHINTARGET

TextToFind

この構造体はRichEditコントロールとしてScintillaを扱った古いコードのためにWin32構造体FINDTEXTEXと同じ形式で定義される。

struct TextToFind {
    struct CharacterRange chrg;     // range to search
    char *lpstrText;                // the search pattern (zero terminated)
    struct CharacterRange chrgText; // returned as position of matching text
};

SCI_SEARCHANCHOR

SCI_SEARCHNEXT(int searchFlags, const char *text)

SCI_SEARCHPREV(int searchFlags, const char *text)

これらのメッセージはリロケータブル検索サポートを提供する。
これが、複数の増加の対話的な検索が選択にテキストを設立するようにまだ設定している間に記録されたマクロであることを許容するので、検索/選択操作は自己充足的である。
マクロ記録が有効なら、これらの3個のメッセージがSCN_MACRORECORD通知を送る。


SCI_SEARCHANCHORは検索の開始位置を設定し、SCI_SEARCHNEXTとSCI_SEARCHPREVで現在の選択範囲の先頭あるいは最後(文書の先頭に近い方)を示す。
SCI_SEARCHNEXTまたはSCI_SEARCHPREVを呼び出すときは常に事前にSCI_SEARCHANCHORを呼び出すべきである。


SCI_SEARCHNEXTとSCI_SEARCHPREVは次あるいは前の合致部分を検索する。
検索文字列はtextで指定し、これは0終端文字列へのポインタである。
検索方法はsearchFlagsで調整できる。
正規表現で指定したときはSCI_SEARCHPREVは最初の合致部分文字列を探し当てるだけで、アンカーポイントの一つ前の合致部分を検索するわけではない。


何も見つからないときは-1を返し、そうでないときはマッチするテキストの開始位置の値を返す。
マッチテキストを示すために選択部が更新されるが、ビュー内にスクロールすることはない。

[star] 関連項目: SCI_SEARCHINTARGET, SCI_FINDTEXT

対象を使う検索と置換

SCI_REPLACESELを使うと視覚的に確認できるその他の変更やスクロールが発生する。これは時に思わぬ動作の場合がある。
すべて置換コマンドのような多数の変更を行う場合、targetを代わりに使うことができる。
まず変更される範囲をtargetに設定し、SCI_REPLACETARGETやSCI_REPLACETARGETREを呼び出す。


targetで指定した範囲内での検索はSCI_SEARCHINTARGETで実行される。
文字数を別に与えられた文字列を使うため、ヌル文字を検索することもできる。
検索に成功すると範囲の長さ、失敗すると-1が返される。
失敗した場合、targetは削除されない。
SCFIND_MATCHCASE、SCFIND_WHOLEWORD、SCFIND_WORDSTART、SCFIND_REGEXPといったフラグが SCI_SEARCHINTARGETで使われるとき、SCI_SETSEARCHFLAGSとも組み合わせることができる。
構造体へのポインタが不要なことから、SCI_SEARCHINTARGETはいくつかの場合においてSCI_FINDTEXTよりも簡単に使うことができる。

  • SCI_SETTARGETSTART(int pos)
  • SCI_GETTARGETSTART
  • SCI_SETTARGETEND(int pos)
  • SCI_GETTARGETEND
  • SCI_TARGETFROMSELECTION
  • SCI_SETSEARCHFLAGS(int searchFlags)
  • SCI_GETSEARCHFLAGS
  • SCI_SEARCHINTARGET(int length, const char *text)
  • SCI_REPLACETARGET(int length, const char *text)
  • SCI_REPLACETARGETRE(int length, const char *text)

SCI_SETTARGETSTART(int pos)

SCI_GETTARGETSTART

SCI_SETTARGETEND(int pos)

SCI_GETTARGETEND

targetの開始および終了を設定あるいは取得する。
正規表現を使わない検索を行っている場合は、開始点を終了点より後ろに置くことができる。
このような指定を行うと文書の末尾側から合致部分を検索していく。
targetはSCI_SEARCHINTARGETの成功によっても設定される。

SCI_TARGETFROMSELECTION

選択の開始と終了位置を対象の開始と終了にセットする。

SCI_SETSEARCHFLAGS(int searchFlags)

SCI_GETSEARCHFLAGS

これらはSCI_SEARCHINTARGETによって使われるsearchFlagsを取得およびセットする。
これらは簡単な正規表現検索を含むいくつかのオプションフラグがある。

SCI_SEARCHINTARGET(int length, const char *text)

これはSCI_SETTARGETSTARTとSCI_SETTARGETENDによって定義された目標のテキスト文字列の最初の出来事を探す。
テキスト文字列はゼロ終端しない; サイズは長さでセットされる。
検索はSCI_SETSEARCHFLAGSによって検索フラグがセットされることで変更される。
検索が成功すると、目標は見つかったテキストをセットし、戻り値はマッチングテキストの開始位置である。
もし検索に失敗すると、-1を返す。

SCI_REPLACETARGET(int length, const char *text)

lengthが-1の場合はtextは0終端文字列でなくてはならない。
それ以外の場合はlengthで置換する文字列の文字数を指定する。
戻り値は置換する文字列の長さである。
ドキュメント内の文字列を削除する推奨された方法はtargetに削除される文字列を入れ、空文字列で置換するというものである。

SCI_REPLACETARGETRE(int length, const char *text)

これは、正規表現を使用することで対象を置換する。
もし長さが-1ならテキストはゼロで終端された文字列であり、そのほかの場合、長さは使う文字数である。
置換文字列は最新の正規表現検索からタグ付けをされたマッチに置換された、\1から\9のシーケンスでテキスト文字列から形成される。
置換後、対象の範囲は置換テキストを参照する。
戻り値は、置換文字列の長さである。

[star] 関連項目: SCI_FINDTEXT