正则表达式匹配或 richTextBox.Select 中的错误?

Bug in regex matching or in richTextBox.Select?

信息:

我做了一个给richtextbox文本着色的功能,我在richtextbox中打开php个配置文件。

错误:

一切正常,当我打开文件时,文本的颜色与我想要的一样。 但是在我将 RichTextBox 文本保存回文件后,文件类型从“Unix LF”变为“Win CRLF”,并且我设置的颜色出错了。 即使在重新启动应用程序后颜色也不正确。 如果我手动将 config.php 更改回“Unix LF”,颜色又可以了。 在记事本++中将任何文本文件创建为“Unix LF”并手动将其更改为“Win CRLF”,然后在我的应用程序中打开文件会导致相同的错误。

看起来“regExp.Matches”或“richTextBox.Select(match.Index, match.Length)”由于某种原因无法正确匹配文件?

有什么想法吗? 或着色块评论的不同方法? (其他注释类型在我的代码上工作正常,只有块注释有这个错误)

在使用正则表达式处理之前,我也尝试将行结尾转换为 CRLF,但这并没有影响该错误。

[错误][1] [1]: https://i.stack.imgur.com/92SNu.png

代码:

// READ FILE
    public Form_Config()
    {
        // read config.php
        ConfigTextBox.Text = File.ReadAllText("config.php", Encoding.UTF8); // uses RichTextBox

        // tested this also to fix the line endings, but no effects on the bug
        //ConfigTextBox.Text.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); // convert to CRLF

        // colorize text box
        RichTextBox_Colorize(ConfigTextBox);
    }


// SAVE FILE
    private void Button_Config_Save_Click(object sender, EventArgs e)
    {
        ConfigTextBox.SaveFile("config.php", RichTextBoxStreamType.PlainText);
    }


// RichTextBox_Colorize
    private void RichTextBox_Colorize(RichTextBox richTextBox)
    {
        // background color
        richTextBox.BackColor = Color.Black;

        // text color
        richTextBox.ForeColor = Color.Yellow;

        // comment color
        var CommentColor = Color.Lime;


// BUG start
        // colorize "/*...*/" block comments (bugs with unix->win files, line endings causing it?)
        Regex regExp = new Regex(@"/\*.*?\*/", RegexOptions.IgnoreCase | RegexOptions.Singleline);
        foreach (Match match in regExp.Matches(richTextBox.Text))
        {
            richTextBox.Select(match.Index, match.Length);
            richTextBox.SelectionColor = CommentColor;
        }
// BUG end

        // colorize "#" comments (works fine, no bugs)
        Regex regExp2 = new Regex(@"#(.*)", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        foreach (Match match in regExp2.Matches(richTextBox.Text))
        {
            richTextBox.Select(match.Index, match.Length);
            richTextBox.SelectionColor = CommentColor;
        }

        // colorize "//" comments (works fine, no bugs)
        Regex regExp3 = new Regex(@"//(.*)", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        foreach (Match match in regExp3.Matches(richTextBox.Text))
        {
            richTextBox.Select(match.Index, match.Length);
            richTextBox.SelectionColor = CommentColor;
        }

        // scroll caret back to start
        richTextBox.Select(0,0);
        richTextBox.ScrollToCaret();
    }

已解决

好的,所以问题是 RichTextBox 使用 \n 作为换行符... 所以这里是修复(正则表达式之前的 运行):

 // convert to LF (RichTextBox can use only \n as newline)
string foobar = ConfigTextBox.Text.Replace("\r\n", "\n").Replace("\r", "\n");
ConfigTextBox.Text = foobar;