2010-12-06 25 views
1

J'utilise ScintillaNet, un wrapper pour le contrôle Scintilla dans mon application C#. J'ajoute dynamiquement tous les mots qui se terminent par: (appelons ce mot-clé à partir de maintenant). Je l'ai fait en utilisant une regex la chaîne de mots-clés séparés par un espace chaque fois que l'utilisateur appuie sur la touche du côlon. Voici mon code (en cas CharAdded):C# Mettre en évidence les mots qui se terminent par deux-points

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

Maintenant, le problème est, chaque fois qu'un nouveau mot-clé est tapé et l'utilisateur appuie sur le côlon, au lieu de simplement mettre en évidence le mot-clé, il inutilement mettre en évidence chaque mot-clé dans le document à nouveau. Donc, bien que mon codage fonctionne, c'est un mauvais codage, et je me demande comment je peux accélérer mon code en ne mettant en évidence que le dernier mot-clé saisi. Toute aide et/ou idées seraient appréciées.

+0

Cela ne répond pas à la question, mais vous devez supprimer '\ b' de l'intérieur de la classe de caractères. Premièrement, cela ne signifie pas "limite de mot" dans ce contexte, deuxièmement, "\ b" ne correspondra pas après un deux-points, à moins que le caractère suivant ne soit alphanumérique. Utilisez juste '\ b \ w +:'. –

Répondre

2

En fait, ce n'est pas inutile, vous pouvez seulement vérifier le dernier mot, mais que faire si l'utilisateur colle un long texte? Vous devez vraiment vérifier chaque mot un par un, sauf si vous êtes sûr que l'utilisateur ne va pas coller un texte dans le contrôle ou modifier le milieu du texte ..

+0

Eh bien, j'avais déjà prévu d'utiliser ce code pour des choses comme coller (je l'utiliserais dans l'événement TextInserted), mais cela semble vraiment médiocre de mettre en évidence chaque mot quand l'utilisateur n'en tape qu'un seul. Il y a parfois un décalage d'environ 1-2 secondes lorsque l'utilisateur tape un deux-points, et cela peut devenir très gênant pour les documents longs. – david

+0

Il n'y a pas de moyen facile de le faire, vous pouvez seulement vérifier si le mot-clé est déjà en surbrillance (je n'ai pas trouvé la partie où vous mettez le mot dans votre code? regex à Scintilla.Lexing.Keywords et je ne sais pas ce que c'est ..) – Pabuc

+0

La seule autre partie que j'ai laissé de côté pour mettre en évidence était Scintilla.Styles [12] .ForeColor = Color.blah. Scintilla s'occupe lui même du lexing/colorizing, je fournis juste les mots-clés. De même, comment vérifier si un mot-clé est déjà mis en évidence en utilisant une regex? C'est ce que je voulais faire, mais je ne savais pas comment. – david

1

Si votre texte est vraiment long et que vous voulez améliorer votre temps de traitement, alors qu'en est-il essayer d'insérer une balise cachée qui marque les mots comme "mis en évidence" et en les ignorant dans votre expression régulière?

+0

Je voulais faire ça, mais je ne sais pas comment je pourrais le faire avec une regex. Pourriez-vous expliquer? – david