正则表达式匹配或 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;
信息:
我做了一个给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;