1

我有一些应用程序可以解析编程语言的源代码。我正在System.Windows.Forms.RichTextBox用作代码编辑器。我使用以下算法突出显示语言的关键字:

  • 每当文本更改时,回到最后一个单词的开头,调用这个子字符串单词。
  • 如果关键字包含单词,则将单词的颜色设置为蓝色,
    否则将单词的颜色设置为黑色

我正在使用RichTextBox.SelectionStarts,RichTextBox.Select(int, int)RichTextBox.SelectionColor. 那工作得很好。

但是,当我按 Enter 键时,光标会回到该行的最开头。作为源代码编辑器,我希望它遵循最后一行乞求。我将前一行中的填充空白字符放在一个字符串str中,然后richTextBox.Text = richTextBox.Text.Insert(richTextBox.SelectionStarts, str). 当我这样做时,所有文本突出显示都已损坏,所有文本均为蓝色。

任何人都可以建议如何在不破坏突出显示的情况下附加行填充空间吗?

4

2 回答 2

2

不知道您的代码的确切问题是什么。也许您应该查看已建立的解决方案。例如,Scintilla.NET是众所周知的Scintilla控件的 .NET 包装器。它可以使用自定义词法分析器进行扩展,因此它可能适合您的需求。

于 2012-07-19T18:12:49.520 回答
0

啊,我明白了。这是一个好的开始:

将其放在表单的最顶部:

using System.Text.RegularExpressions;

然后将其放入RichTextBox TextChanged

            // getting keywords/functions
            string keywords = @"\b(abstract|as|base|break|case|catch|checked|continue|default|delegate|do|else|event|explicit|extern|false|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|switch|this|throw|true|try|typeof|unchecked|unsafe|using|virtual|volatile|while)\b";
            MatchCollection keywordMatches = Regex.Matches(codeRichTextBox.Text, keywords);

            // getting types/classes from the text 
            string types = @"\b(Console)\b";
            MatchCollection typeMatches = Regex.Matches(codeRichTextBox.Text, types);

            // getting comments (inline or multiline)
            string comments = @"(\/\/.+?$|\/\*.+?\*\/)";
            MatchCollection commentMatches = Regex.Matches(codeRichTextBox.Text, comments, RegexOptions.Multiline);

            // getting strings
            string strings = "\".+?\"";
            MatchCollection stringMatches = Regex.Matches(codeRichTextBox.Text, strings);

            string stringz = "bool|byte|char|class|const|decimal|double|enum|float|int|long|sbyte|short|static|string|struct|uint|ulong|ushort|void";
            MatchCollection stringzMatchez = Regex.Matches(codeRichTextBox.Text, stringz);

            // saving the original caret position + forecolor
            int originalIndex = codeRichTextBox.SelectionStart;
            int originalLength = codeRichTextBox.SelectionLength;
            Color originalColor = Color.Black;

            // MANDATORY - focuses a label before highlighting (avoids blinking)
            label1.Focus();

            // removes any previous highlighting (so modified words won't remain highlighted)
            codeRichTextBox.SelectionStart = 0;
            codeRichTextBox.SelectionLength = codeRichTextBox.Text.Length;
            codeRichTextBox.SelectionColor = originalColor;

            // scanning...
            foreach (Match m in keywordMatches)
            {
                codeRichTextBox.SelectionStart = m.Index;
                codeRichTextBox.SelectionLength = m.Length;
                codeRichTextBox.SelectionColor = Color.Blue;
            }

            foreach (Match m in typeMatches)
            {
                codeRichTextBox.SelectionStart = m.Index;
                codeRichTextBox.SelectionLength = m.Length;
                codeRichTextBox.SelectionColor = Color.DarkCyan;
            }

            foreach (Match m in commentMatches)
            {
                codeRichTextBox.SelectionStart = m.Index;
                codeRichTextBox.SelectionLength = m.Length;
                codeRichTextBox.SelectionColor = Color.Green;
            }

            foreach (Match m in stringMatches)
            {
                codeRichTextBox.SelectionStart = m.Index;
                codeRichTextBox.SelectionLength = m.Length;
                codeRichTextBox.SelectionColor = Color.Brown;
            }

            foreach (Match m in stringzMatchez)
            {
                codeRichTextBox.SelectionStart = m.Index;
                codeRichTextBox.SelectionLength = m.Length;
                codeRichTextBox.SelectionColor = Color.Purple;
            }

            // restoring the original colors, for further writing
            codeRichTextBox.SelectionStart = originalIndex;
            codeRichTextBox.SelectionLength = originalLength;
            codeRichTextBox.SelectionColor = originalColor;

            // giving back the focus
            codeRichTextBox.Focus();

这将为RichTextBoxC# 提供编码语法

如果您想要另一种语言的编码语法,请将 的内容keywords string和 , 的内容替换stringz string为您选择的语言。

要更改Color,keywordsstringz, 然后查看foreach (Match m in keywordMatches), 或foreach (Match m in stringzMatchez)

如果您正在使用 C# 以外的任何其他语言,则删除types并编辑stringscomments

我希望这可以帮助你 :)

于 2019-10-21T07:20:40.833 回答