2

RichTextBoxの検索および検索と置換関数を作成したいと思います。これまでのところ、.Find()関数が非常に便利であることがわかりましたが、テキストボックス内の次の単語にスキップさせる良い方法は考えられません。

これまでのところ私はこれを持っています:

BeginIndex = txtDocument.Find(str, BeginIndex + WordLength, RichTextBoxFinds.None);
WordLength = str.Length;

BeginIndexはパブリックであり、WordLengthと同じように0で始まる変数です。このようにして、最初の文字を調べ始めますが、次回は同じ文字が見つかりません。しかし、大きな誤動作があります。それを説明してみましょう。「Hello blablab hello blablaal balbalbla hello blabla」この文で「hello」を検索すると、最初のhello、2番目、3番目のhelloが選択されます。その後、再び3番目。その後、2番目と3番目が何度も見つかります。WordLengthはまだ>0であるため。

したがって、Find()メソッドに、すでに見つかったものを見つけることは許可されていないことを伝える新しい方法が必要ですが、次に進み、最後のものが見つかったら、最初に戻ります。これを行うためのよりクリーンでより良い方法はありますか?

編集:ほぼ修正されました。今はこれを使用しています:

BeginIndex = txtDocument.Find(str, BeginIndex, RichTextBoxFinds.None);

if(BeginIndex == -1) {
    BeginIndex = 0;
    SearchString(str, heelwoord, casesensitive);
}

BeginIndex += str.Length;

さて、これは非常にうまくループします。それ自体を呼び出す代わりに(ifで)、「Endに到達しました!」のようなメッセージボックスを作成することもできます。しかし、何も見つからない場合は、エラーが発生します。MatchCaseを実行するチェックボックスとWholeWordを実行するチェックボックスの2つのチェックボックスで関数を使用しますが、「asdasdasd」で「a」を検索してWholeWordをチェックすると、見つからないためエラーになります。

4

1 に答える 1

1

Knuth-Morris Prattのアルゴリズムを実装する方が良い場合があります。これは、内部の.NETソリューションよりも高速であり、文字列がどこにあるかを正確に知ることができます。後でサブストリング連結マジックを実行し、結果をrtfのテキストに割り当てると、すべて設定されます。

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

于 2012-05-02T11:59:02.890 に答える