2016-06-10 1 views
1

У меня вопрос с использованием rtb и regex вместе.C# Выделите цвет текста rtb на основе регулярного выражения

У меня есть текст, как vK-lKs-812349;jra_6993788428;[email protected]

Моя функция будет разделять данные по deli'ter «;» и сопоставляет каждую часть с регулярными выражениями шаблонов

  • для первой части "^[a-zA-Z]{2}-[a-zA-Z]{3}-[0-9]{7}$"
  • для 2-я части "^[a-zA-Z]{3}_[0-9]{10}$"
  • для 3-я части "^[a-zA-Z]{3}-[0-9&~%@*^<>!#$]{7}$"

То, что я хочу, у меня есть эти данные в строке в RTB (вся строка имеет аналогичные данные, то есть одну и ту же картину данных). Когда я нажимаю кнопку, функция должна получить строку, в которой находится курсор, и она должна соответствовать шаблону, и если регулярное выражение не соответствует, оно должно изменить цвет этой части текста.

Пример: Если я в строке 2, и часть данных второй является «ZZA 6993788428», то, как есть _ отсутствует регулярное выражение не будет матч, поэтому я хочу, чтобы эта часть в RTB должен получить красный цвет ,

Ваша помощь будет оценена по достоинству. Спасибо ...

+0

Thx для редактирования @ user861594 – Roshan

ответ

1

Попробуйте

 if (!string.IsNullOrEmpty(richTextBox1.Text)) 
      { 
       int lineStart = 0; 
       foreach (string item in richTextBox1.Lines) 
       { 
        List<string> lst = item.Split(new char[] { ';' }).ToList(); 
        if (lst.Count == 3) 
        { 
         if (!Regex.IsMatch(lst[1], "^[a-zA-Z]{3}_[0-9]{10}$")) 
         { 
          int Start = richTextBox1.Find(item, lineStart, richTextBox1.TextLength, RichTextBoxFinds.WholeWord); 
          int End = Start + item.Length; 

          richTextBox1.Select(Start, End); 
          richTextBox1.SelectionBackColor = Color.Red; 
         } 
         else 
         { 
          int Start = richTextBox1.Find(item, lineStart, richTextBox1.TextLength, RichTextBoxFinds.WholeWord); 
          int End = Start + item.Length; 

          richTextBox1.Select(Start, End); 
          richTextBox1.SelectionBackColor = Color.Green; 
         } 
        } 
        lineStart += item.Length; 
       } 
      } 
+0

Эй, мой вопрос не касается шаблона регулярных выражений. Plzz проверить вопрос. Я сказал, что если шаблон регулярного выражения не совпадает с текстом, то текст i.e, 'jra 6993788428' цвет переднего плана должен быть изменен на красный в rtb в приложении формы Windows C# – Roshan

+0

теперь проверьте его и позвольте мне. – King

+0

Thx для вашего интереса, но я хочу, чтобы функция работала в строке, в которой мой курсор. Я нашел ответ сам. Но я хочу немного улучшить свой код. Я хочу, чтобы поиск и замена выполнялись в этой конкретной строке. – Roshan

1

Я нашел код на этот вопрос сам. Я создал таймер, который получает строку no из rtb и помещает в глобальную переменную.

  timer1.Start(); 
     timer1.Tick += new EventHandler(LineEvent); 

и глобальная переменная и события

 public static class foo 
    { 
     public static int lineno; 
    } 

     private void LineEvent(object sender, EventArgs eArgs) 
    { 
     int IndexCoun = rtb1.SelectionStart;//Index count where actually the mouse is clicked in the richtextbox 
     foo.lineno = rtb1.GetLineFromCharIndex(IndexCoun);//Get the line no 
    } 

И главная функция, которая соответствует функции и изменяет RTB является

 private void RegexCla(string value, string pattern, string data) 
    { 
     if(Regex.IsMatch(value, pattern) == true) 
     { 
      int index = 0; 
      for (int i = 0; i < foo.lineno; i++) 
      { 
       int gelen = rtb1.Lines[i].Length; 
       index = index + gelen; 
      } 
      rtb1.Find(data, index, RichTextBoxFinds.WholeWord); 
      rtb1.SelectionColor = Color.Green; 
      rtb1.SelectedText = value; 
     } 
     else 
     { 
      int index = 0; 
      for (int i = 0; i < foo.lineno; i++) 
      { 
       int gelen = rtb1.Lines[i].Length; 
       index = index + gelen; 
      } 
      rtb1.Find(data, index, RichTextBoxFinds.WholeWord); 
      rtb1.SelectionColor = Color.Red; 
     } 
    } 

И, наконец, кнопка щелчок

 private void RegBtn_Click(object sender, EventArgs e) 
    { 
     string[] rtblines = rtb1.Lines; 
     var reqtext = rtblines[foo.lineno]; 
     string[] reclis = reqtext.Split(';'); 
     RegexCla(reclis[0].Replace(" ", ""), "^[a-zA-Z]{2}-[a-zA-Z]{3}-[0-9]{7}$", reclis[0]); 
    } 

Спасибо за вашу поддержку @King.

1
private void Findword(string FindText, RichTextBox rt) 
    { 
     try 
     { 
      List<int> lst = new List<int>(); 
      bool IsRun = true; 
      int Index = 0; 
      int count =0; 

      lst.Add(-1); 
      lst.Add(0); 
      lst.Add(rt.TextLength); 
      while (IsRun) 
      { 
       Index = rt.Find(FindText, Index, RichTextBoxFinds.WholeWord); 
       if (lst.Contains(Index)) 
        break; 
       else 
        count++; 
       lst.Add(Index); 
       Index += FindText.Length; 
      } 

      MessageBox.Show(FindText + " Count: " + count); 
     } 
     catch { } 
    } 
+0

Спасибо @King Я исправил его мат. Спасибо за вашу поддержку. Выберите его как ответ и^мне, если вам это нравится. благодаря – Roshan

Смежные вопросы