C# 如何在Winforms RichTextBox中实现基本语法高亮显示?

C# 如何在Winforms RichTextBox中实现基本语法高亮显示?,c#,.net,regex,winforms,richtextbox,C#,.net,Regex,Winforms,Richtextbox,我有一个要在我的RichTextBox控件中突出显示的单词列表,我有一个如何做的想法,但在将所有内容解析为单独的单词时遇到了问题 如何将一行或整个文本解析为单独的单词,然后使用RichTextBox.Select()方法对其进行枚举和着色 这是个好办法吗?有更好/更快的方法吗?试试string.Split方法。它返回由分隔符分隔的字符串数组 您还可以找到有用的链接: 更重要的是:有一个类似的应用程序,你可以用它来代替RichTextBox,它是免费的。它是中使用的编辑器。我认为您可能必须从#de

我有一个要在我的
RichTextBox
控件中突出显示的单词列表,我有一个如何做的想法,但在将所有内容解析为单独的单词时遇到了问题

如何将一行或整个文本解析为单独的单词,然后使用
RichTextBox.Select()
方法对其进行枚举和着色


这是个好办法吗?有更好/更快的方法吗?

试试
string.Split
方法。它返回由分隔符分隔的字符串数组

您还可以找到有用的链接:

更重要的是:有一个类似的应用程序,你可以用它来代替RichTextBox,它是免费的。它是中使用的编辑器。我认为您可能必须从#develop source下载中提取程序集,但这是值得的。

您可以使用该方法在RichTextBox中查找字符串。此方法返回找到的文本的位置。该链接中的代码示例将突出显示文本

使用RichTextBox.Find(String,Int32,Int32,RichTextBoxFinds)方法在控件中查找字符串。然后可以通过将起始点更改为当前单词后的点进行迭代

不确定该方案的性能,但它会起作用


可能不是最快的方法,但它很有效。
首先调用
ClearHighLighting
清除上一个,然后调用
SetHighLighting

private readonly List<HighLight> _highLights = new List<HighLight>();
private class HighLight
{
  public int Start { get; set; }
  public int End { get; set; }
}

public void SetHighLighting(string text)
{

    // Clear Previous HighLighting
    ClearHighLighting();

    if (text.Length > 0)
    {
        int startPosition = 0;
        int foundPosition = 0;            
        while (foundPosition > -1)
        {
            foundPosition = richTextBox1.Find(text, startPosition, RichTextBoxFinds.None);
            if (foundPosition >= 0)
            {
                richTextBox1.SelectionBackColor = Color.Yellow;
                int endindex = text.Length;
                richTextBox1.Select(foundPosition, endindex);                        
                startPosition = foundPosition + endindex;                        
                _highLights.Add(new HighLight() { Start = foundPosition, End = endindex });
            }
        }
    }
}

public void ClearHighLighting()
{
    foreach (var highLight in  _highLights)
    {
        richTextBox1.SelectionBackColor = richTextBox1.BackColor;
        richTextBox1.Select(highLight.Start, highLight.End);                        
    }
    _highLights.Clear();
}
private readonly List_highLights=new List();
私人课堂亮点
{
public int Start{get;set;}
公共int End{get;set;}
}
公共空白集高亮显示(字符串文本)
{
//清除以前的突出显示
ClearHighLighting();
如果(text.Length>0)
{
int startPosition=0;
int foundPosition=0;
while(foundPosition>-1)
{
foundPosition=richTextBox1.Find(text,startPosition,RichTextBoxFinds.None);
如果(foundPosition>=0)
{
richTextBox1.SelectionBackColor=Color.Yellow;
int endindex=text.Length;
richTextBox1.选择(foundPosition,endindex);
startPosition=foundPosition+endindex;
_添加(新的HighLight(){Start=foundPosition,End=endindex});
}
}
}
}
公共空白清除突出显示()
{
foreach(变量高亮显示在_高亮显示中)
{
richTextBox1.SelectionBackColor=richTextBox1.BackColor;
richTextBox1.选择(highLight.Start、highLight.End);
}
_高亮显示。清除();
}

谢谢,我现在试过了,这应该行得通,但后来意识到我无法将它们用于Select方法,因为我需要知道该单词的起始位置,以及同一行中有多个相同单词的情况。投票人敢说为什么吗?