2011-03-24 2 views
0
 let m = Regex.Match(X.Text, "\\b(select)|(where)|(from)\\b", RegexOptions.IgnoreCase) 

il met en surbrillance uniquement Select, donc je suppose que le problème est dans ma syntaxe Regex.Match, mais je ne peux pas voir où?Regex Match un des chaînes

avec alll les changements ma solution actuelle est à la recherche comme ceci:

module SQL_Highlighing 

open System.Runtime.InteropServices 

module Lock = 
    [<DllImport(@"User32", CharSet = CharSet.Ansi, SetLastError = false, ExactSpelling = true)>] 
    extern void LockWindowUpdate(int hWnd) 

open System.Text.RegularExpressions 
open System.Drawing 

type SyntaxRTB() = 
    inherit System.Windows.Forms.RichTextBox() 

    override X.OnTextChanged(e : System.EventArgs) = 
     base.OnTextChanged(e); X.ColorTheKeyWords() 

    member X.ColorTheKeyWords() = 
     let HL s c = 
      let color(m : Match, color : Color) = 
       X.SelectionStart <- m.Index 
       X.SelectionLength <- m.Length 
       X.SelectionColor <- color 
      Regex.Matches(X.Text, "\\b" + s + "\\b", RegexOptions.IgnoreCase) |> fun mx -> 
       for m in mx do if (m.Success) then color(m,c) 

     let SelectionAt = X.SelectionStart 
     Lock.LockWindowUpdate(X.Handle.ToInt32()) 

     HL "(select)|(where)|(from)|(top)|(order)|(group)|(by)|(as)|(null)" Color.Blue 
     HL "(join)|(left)|(inner)|(outer)|(right)|(on)" Color.Red 
     HL "(and)|(or)|(not)" Color.DarkSlateGray 
     HL "(case)|(when)|(then)|(else)|(end)" Color.BurlyWood 
     HL "(cast)|(nvarchar)|(bit)" Color.BlueViolet 
     HL "(datepart)" Color.Teal 

     X.SelectionStart <- SelectionAt 
     X.SelectionLength <- 0 
     X.SelectionColor <- Color.Black 
    Lock.LockWindowUpdate(0) 
+0

Je doute que cela soit lié à votre problème, mais votre signature P/Invoke est erronée. Il devrait être 'extern bool LockWindowUpdate (nativeint hWnd)' et 'SetLastError' devrait être défini sur' false'. – ildjarn

+2

Hhm, il ne fera que mettre en évidence la première sélection, où ou à partir de. Utilisez 'Regex.Matches' à la place. Cela peut être le problème (n'avez pas testé votre code). –

+0

Aussi, qu'est-ce que vous essayez d'accomplir avec les '\\ b's? Attendez-vous vraiment des littéraux de retour arrière dans vos données d'entrée? – ildjarn

Répondre

4

migré de commentaire

Regex.Match sera seulement vous donner le premier match. Au lieu de cela, vous devez utiliser Regex.Matches.

5

Je recommande d'utiliser un banc d'essai d'expression régulière. Je trouve GSkinner RegExr très utile.

\ b représente une limite, mais | est la séparation de votre expression. Ce que vous obtenez est en fait:

\b(select) 
or 
(where) 
or 
(from)\b 

Je suppose que vous voulez que la limite pour chacun, afin d'ajouter un autre groupe empêcherait la séparation:

\b((select)|(from)|(where))\b 
+2

+1 C'est un autre problème :) Une simplification serait '\ b (select | from | where) \ b' car' '' ont la priorité la plus basse. –