2010-12-06 11 views
1

私はC#アプリケーションでScintillaコントロールのラッパーであるScintillaNetを使用しています。私は最後にすべての単語を動的に追加しています:(今からこのキーワードを呼び出してみましょう)。私は、正規表現を使用して、ユーザーがコロンキーを押すたびに空白で区切られたキーワード列を使用しています。C#コロンで終わる単語を強調表示します。

 if (e.Ch == ':') 
     { 
      string wp = string.Empty; 
      Regex r = new Regex(@"\b\w+[:\b]"); 
      MatchCollection m = r.Matches(Scintilla.Text); 
      for (int i = 0; i < m.Count; i++) 
      { 
       wp += " " + m[i].Value.Substring(0, m[i].Value.Length - 1); // Remove the colon 
      } 
      wp = wp.ToLower(); 
      Scintilla.Lexing.Keywords[3] = wp; 
     } 

今の問題は、新しいキーワードが入力されるたびにあり、ユーザーがちょうどキーワードを強調するのではなく、コロンを押すと、それが不必要にひとつひとつをハイライト表示されます:ここでは(CharAddedイベントで)私のコードですキーワードを再度文書に追加します。だから私のコーディングはうまくいきますが、それはかなり悪いコーディングです。最後に入力したキーワードだけを強調表示するだけで、コードをもっと速くすることができますか?どんな助けやアイデアもありがとうございます。

+0

これは質問に答えませんが、文字クラスの中から '\ b'を削除する必要があります。第1に、この文脈では「単語境界」を意味するものではなく、次の文字が英数字でない限り、「\ b」はコロンの後ろに一致しません。 '\ b \ w +:'を使うだけです。 –

答えて

2

実際には不要ではありませんが、最後の単語のみを確認することができますが、長いテキストをペーストするとどうなりますか?ユーザーがコントロールにテキストを貼り付けたり、テキストの中央を編集したりしない限り、実際にはすべての単語を1つ1つ確認する必要があります。

+0

さて、私はすでにこのコードを貼り付け(TextInsertedイベントで使用します)のようなものに使用する予定でしたが、ユーザーが1つだけ入力すると、すべての単語を再度強調表示するのは難しいようです。ユーザーがコロンを入力すると約1-2秒遅れることがあり、長い文書では非常に迷惑になることがあります。 – david

+0

簡単な方法はありません。キーワードが既にハイライト表示されているかどうかを確認するだけです(コード内の単語を強調表示する部分は見つかりませんでした。正規表現をScintilla.Lexing.Keywordsに置き換えてください。) – Pabuc

+0

強調表示のために除外した唯一の部分は、Scintilla.Styles [12] .ForeColor = Color.blahでした。 Scintilla自体がレキシング/カラー化を処理しますが、私はキーワードを提供します。また、正規表現を使用してキーワードが既に強調表示されているかどうかを確認するにはどうすればよいですか?それは私がやりたかったことですが、私はどうしたらいいのか分かりませんでした。 – david

1

テキストが本当に長くて改善したい場合あなたの処理時間は、 "ハイライトされた"という言葉にフラグを立て、あなたの正規表現では無視する隠しタグを挿入しようとするとどうなりますか?

+0

私はそれをしたいと思っていましたが、正規表現を使ってどうすればいいのか分かりません。あなたは説明できますか? – david

関連する問題