2010-12-06 45 views
1

結束我使用ScintillaNet,在我的C#應用​​程序的Scintilla的控制包裝C#亮點的話。我動態地添加了以下結尾的所有單詞:(讓我們從現在開始調用此關鍵字)。我通過使用正則表達式來實現這一點,即每次用戶按下冒號鍵時用空格分隔的關鍵字字符串。這裏是我的代碼(在CharAdded事件):與結腸

 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; 
     } 

現在的問題是,每一個新的關鍵字輸入時間和用戶按下結腸,而不是隻強調關鍵字,這將不必要地突出每一個關鍵字再次在文檔中。所以儘管我的編碼工作,這是非常糟糕的編碼,我想知道如何通過只突出顯示最後一個關鍵字鍵入我的代碼更快。任何幫助和/或想法將不勝感激。

+0

這不回答這個問題,但你應該從字符類中刪除`\ B`。首先,在這種情況下,它並不意味着「文字邊界」,其次,`\ b`無論如何不會匹配冒號,除非下列字符是字母數字。只需使用`\ b \ w +:`。 – 2010-12-06 12:19:45

回答

2

這是沒有必要實際上,你可以只檢查硬道理但如果用戶粘貼一個長的文本?你真的有一個檢查每一個字,除非你是確保用戶不會將文本粘貼到控件或編輯文本的中間..

+0

嗯,我已經計劃使用像粘貼的東西(我用它在TextInserted事件)的代碼,但它確實看上去很窮當用戶類型只有一個再次強調每一個字。當用戶輸入一個冒號時,有時會出現大約1-2秒的滯後時間,並且對於長文檔可能會非常煩人。 – david 2010-12-06 12:29:59

+0

有沒有簡單的方法來做到這一點,你只能檢查關鍵字是否已經突出顯示(我找不到你在代碼中突出顯示該單詞的部分??看起來它只會添加與您的相匹配的每個單詞正則表達式來Scintilla.Lexing.Keywords,我不知道那是什麼。) – Pabuc 2010-12-06 12:36:42

1

如果你的文字是很長的,你想提高你的處理時間,那麼試圖插入一個隱藏的標記,標記單詞爲「突出顯示」,並忽略這些在你的正則表達式?