正则表达式会获取与之匹配的所有内容以及未包含在列表中的所有内容

时间:2018-07-28 20:21:44

标签: regex forms winforms

我试图在RichTextBox内获取所有正则表达式选择,并且我想更改某些关键字的颜色。有用。但是,当我有一个单词是另一个单词的一部分时,它会一直突出显示原始单词。当我删除整个内容时,该点将保持该颜色。

我需要某种方式来存储正则表达式搜索器经过且不匹配的每个值,并使用RichTextBox选择所有值,然后更改颜色。我不知道如何做到这一点。我尝试了^关键字,但是没有做任何事情。这是我的算法,以备您需要时使用:

我在这里用每个正则表达式值和相应的颜色声明字典:

public static Dictionary<string, Color> regexList = new Dictionary<string, Color>()
{
    {"in", Color.Red},            {"and", Color.AliceBlue},
    {"end", Color.Red},           {"include", Color.CadetBlue},
    {"repeat", Color.AliceBlue},  {"break", Color.AliceBlue},
    {"false", Color.AliceBlue},   {"local", Color.AliceBlue},
    {"return", Color.AliceBlue},  {"do", Color.Red},
    {"for", Color.Red},           {"nil", Color.AliceBlue},
    {"then", Color.AliceBlue},    {"else", Color.AliceBlue},
    {"function", Color.AliceBlue},{"not", Color.AliceBlue},
    {"true", Color.Green},        {"elseif", Color.AliceBlue},
    {"if", Color.AliceBlue},      {"or", Color.AliceBlue},
    {"until", Color.AliceBlue},   {"while", Color.AliceBlue},
    // Containers
    { "\"(.*)\"", Color.Yellow},
};

每次RichTextBox的文本更改时都会调用它。

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
    foreach (string str in regexList.Keys)
    {
        Regex rx = new Regex(str);

        int index = TextField.SelectionStart;
        TextField.ForeColor = Color.FromArgb(226, 226, 226);
        foreach (Match m in rx.Matches(TextField.Text))
        {
            TextField.Select(m.Index, m.Value.Length);
            TextField.SelectionColor = regexList[str];
            TextField.SelectionStart = index;
            TextField.SelectionColor = Color.FromArgb(226, 226, 226);
        }
    }
}

我将对此进行检查,并尽可能地对其进行更新。我只需要某种方法来选择正则表达式无法捕获的所有内容并更改其颜色。

编辑

我发现的解决方案(该问题的解决方案应该在语法上突出显示文本框)仅使用Scintilla.Net。对于那些检查了这篇文章并希望得到答案并需要突出显示语法的人,这里是其主页的link。我的手动方法花了太长时间才能获取所有关键字,因此效果很好。

0 个答案:

没有答案