C# Richtextbox:在多行文本中查找多行字符串

C# Richtextbox:在多行文本中查找多行字符串,c#,winforms,C#,Winforms,我有一个RichTextBox,其中显示一个段落,我需要更改多行文本的颜色 我尝试使用RichTextBox.Find方法,但它只适用于一行。 这是我的密码: richTextBox1.Text=@"Line 1 Line 2 Line 3 Line 4 Line 5 " Font fnt = new Font("Verdana", 8F, FontStyle.Italic, GraphicsUnit.Point); string mystring = @"Line 2 Line 3"; //s

我有一个RichTextBox,其中显示一个段落,我需要更改多行文本的颜色

我尝试使用
RichTextBox.Find
方法,但它只适用于一行。
这是我的密码:

richTextBox1.Text=@"Line 1
Line 2
Line 3
Line 4
Line 5
"
Font fnt = new Font("Verdana", 8F, FontStyle.Italic, GraphicsUnit.Point);
string mystring = @"Line 2
Line 3";
//string mystring = @"Line 2";
if (richTextBox1.Find(mystring)>0)
{
    int my1stPosition = richTextBox1.Find(mystring);
    richTextBox1.SelectionStart=my1stPosition;
    richTextBox1.SelectionLength=mystring.Length;
    richTextBox1.SelectionFont=fnt;
    richTextBox1.SelectionColor=Color.CadetBlue;
}
因此,当我只搜索
“第2行”
时,它可以工作,但不适用于:

"Line 2  
Line 3"
我遗漏了什么吗?

该方法无法在
文本的多行中搜索

如果您的目的是搜索和选择不同行的内容,则可以将这些行拆分为不同的子字符串。这样,您就可以选择多条线,即使它们不是连续的:

注意
RichTextBox
\r\n
Windows中的Environment.Newline
)转换为
\n

例如:

richTextBox1.Text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5";
string[] searchLines = new[] {"Line 2", "Line 3"};

using (Font fnt = new Font("Verdana", 8F, FontStyle.Italic, GraphicsUnit.Point))
{
    foreach (string line in searchLines)
    {
        int my1stPosition = richTextBox1.Find(line);
        if (my1stPosition > 0)
        {
            richTextBox1.SelectionStart = my1stPosition;
            richTextBox1.SelectionLength = line.Length;
            richTextBox1.SelectionFont = fnt;
            richTextBox1.SelectionColor = Color.CadetBlue;
        }
    }
}
如果仍要搜索整个字符串,请在
RichTextBox上使用
IndexOf
。Text
属性:

string searchLines = $"Line 2\nLine 3";

(...)
int my1stPosition = richTextBox1.Text.IndexOf(searchLines);
我错过什么了吗

我也错过了,第一眼

注 接受字符串作为参数的查找方法无法查找RichTextBox中多行文本中包含的文本。执行这样的搜索将返回一个负值(-1)


您确定rtb的行尾类型与搜索字符串的行尾类型相同吗?(CRLF与LF等)。那标记呢?rtb中是否有任何搜索字符串没有的不可见rtf格式标记?我尝试使用richTextBox1.Text=mystring,在这种情况下,textbox和find将具有相同的值,但仍然不起作用。只有您能够解决此问题,除非您能可靠地向我们提供数据等。。可能会将搜索字符串转换为字节(encoding.ascii.getbytes),将rtb文本转换为字节,然后观察差异。。你的“我将文本设置为mystring”是的,但这可能意味着文本位于位置0,而你的if只考虑索引大于0时找到的内容。请尝试>=0?在代码上添加注释,然后查找并再次查找。。为什么不在第一次查找时捕获int索引呢<代码>int idx=查找。。。;如果(idx>=0).
这个主意很好用。小的改进,因为我的搜索字符串不是常量,所以我改为string[]searchLines=mystring.Split(new[]{Environment.NewLine},StringSplitOptions.removemptyEntries);好啊请参阅注释,它可能会节省时间(在某些情况下)。即使第二个选项也可以工作,但长度似乎有一些问题,它会计算行字符数并更改颜色以获得超出需要的几个额外字符使用
\n
作为分隔符,而不是
\r\n
(如注释中所示),否则字符串长度将与实际文本长度不匹配。