c#根据正则表达式突出显示rtb文本颜色

时间:2016-06-10 06:22:13

标签: c# regex richtextbox

我有问题一起使用rtb和regex。

我有vK-lKs-812349;jra_6993788428;Enx-2674@62

这样的文字

我的功能将通过deli'ter'分割数据;'并使用正则表达式匹配每个部分

  • 第一部分"^[a-zA-Z]{2}-[a-zA-Z]{3}-[0-9]{7}$"
  • 第二部分"^[a-zA-Z]{3}_[0-9]{10}$"
  • 第3部分"^[a-zA-Z]{3}-[0-9&~%@*^<>!#$]{7}$"

我想要的是我在rtb中将这些数据排成一行(所有行都有类似的数据,即相同的数据模式)。当我单击一个按钮时,函数应该得到光标所在的行,它应该与模式匹配,如果正则表达式不匹配,它应该改变文本特定部分的颜色。

示例:如果我在第2行并且第2部分数据是'zza 6993788428'那么因为_缺少正则表达式将不匹配所以我希望这部分在rtb应该得到红色。

我们将不胜感激。感谢...

3 个答案:

答案 0 :(得分: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;
                }
            }

答案 1 :(得分:1)

我自己找到了这个问题的代码。我创建了一个计时器,它从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的所有支持。

答案 2 :(得分: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 { }
    }