次のようなコードで、RichTextBox を使用して REGEX 式をテストします。
rtbMain.SelectAll();
rtbMain.SelectionColor = Color.Black;
rtbMain.SelectionBackColor = Color.White;
Regex regex = new Regex(txtRegexPattern.Text, regexOptions);
Match matches = regex.Match(txtTest.Text);
while (matches.Success)
{
rtbMain.Select(matches.Index, match.Length);
rtbMain.SelectionColor = Color.Red;
rtbMain.SelectionBackColor = Color.Black;
}
ただし、この方法では、強調表示する文字が数千 (1000 以上) を超えるとすぐに遅くなります。コードがユーザーに正規表現全体を入力する機会を与えるように、処理を遅らせることができることはわかっていますが、それでも RichTextBox の強調表示の動作が遅すぎると思います。
現在のソリューションを高速化するためのさまざまなアプローチと方法を Google で検索しましたが、運がありませんでした。「シンタックス ハイライト」を許可するテキスト エディター (ScintillNET、Avalon など) がいくつかあることに気付きましたが、それらは入力として XML を使用するため、私のプロジェクト (すべての KeyUp イベントで XML を生成する) でそれらを使用すると思います。 「ベストプラクティス」になります。
ここで「高速色のテキストボックス」を見つけてテストしました:https://github.com/PavelTorgashov/FastColoredTextBox ...しかし、これの問題は、独自の改行とタブを使用しているときに貼り付けの内容を置き換えることです文字であり、REGEX テスターでは使用できません。
おそらく別のユーザーコントロールを使用して、すべての一致を強調表示するより速い方法はありますか?
編集:
アプローチ 1: 基礎となる RTF ドキュメントを生成する方が高速でしょうか? 試してみましたが、特殊文字に問題があったため、ドキュメント全体の強調表示をテストできましたが、1 行の通常の文字では非常に高速に動作するように見えました。RTF を構築するのは非常に難しいことを読んだので、これに取り組むのを一時停止しました。また、既存の RTF ライブラリはどれも使用できなかったと思います。
アプローチ 2: RichTextBox の表示されている部分しか取得できないので、その部分だけを強調表示することを考えていました。これにより処理が大幅に削減されると思いますが (RTB サイズによって異なります)、ユーザーがスクロールするたびに強調表示をトリガーする必要があります。これがうまく機能し、適切なユーザー エクスペリエンスを生み出すかどうかはわからないので、まだ試していません。
上記のアプローチのいずれか、または他のアプローチを推奨する人はいますか?