C#从字符串中删除注释

时间:2011-12-06 11:31:25

标签: regex string .net-2.0 trim

我正在使用WinForms NET 2.0。我正在编写一个小函数来修剪某些选定文本的注释。它的作用是用单独的行分割选定的文本,然后:

  • 如果该行不包含任何注释,则会附加该注释。
  • 如果该行包含一些文本后跟注释,则会附加修剪后的注释。
  • 如果该行以注释开头,则不会附加。这是在if语句中。
  • 如果该行为空白,则不会追加该行。这也在if语句中。

这是我的代码:

        string[] lines = tb.SelectedText.Split('\n');
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < lines.Length; i++)
        {
            if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$"))
            {
                if (Regex.IsMatch(lines[i], @"^(.*);(.*)$"))
                    sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim());
                else
                    sb.AppendLine(lines[i]);
            }
        }
        tb.SelectedText = sb.ToString();

问题是,它没有按预期工作。假设我有以下文字:

test    ;test

test2   ;test

我希望这可以修剪注释并删除空行,但不是,空白行仍然存在。为什么是这样?我检查了该行是否为空,所以如果该行为空,则StringBuilder不应该附加该行,但由于某种原因,它会这样做。

此外,由于某种原因,stringbuilder会附加一行。如何摆脱它?

2 个答案:

答案 0 :(得分:3)

替换||在&amp;&amp;的if语句中并使用“\ r \ n”而不是“\ n”。试试这个:

var lines = textBox2.SelectedText.Split(new [] {"\r\n"}, StringSplitOptions.None);
var sb = new StringBuilder();

for (int i = 0; i < lines.Length; i++)
{
    var line = lines[i].Trim();
    if ((line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$"))
    {
        if (Regex.IsMatch(line, @"^(.*);(.*)$"))
            sb.AppendLine(line.Substring(0, line.IndexOf(';')).Trim());
        else
            sb.AppendLine(line);
    }
}
textBox2.SelectedText = sb.ToString();

或者使用LinQ和“?:”表达式:

var lines = textBox2.SelectedText .Split(new [] {"\r\n"}, StringSplitOptions.None);
var sb = new StringBuilder();

foreach (var line in lines.Select(t => t.Trim())
                          .Where(line => (line != string.Empty) && !Regex.IsMatch(line, @"^\s*;(.*)$")))
{
    sb.AppendLine(Regex.IsMatch(line, @"^(.*);(.*)$") ? line.Substring(0, line.IndexOf(';')).Trim() : line);
}
textBox2.SelectedText = sb.ToString();

答案 1 :(得分:1)

您的逻辑存在问题

if ((lines[i].Trim() != string.Empty) || !Regex.IsMatch(lines[i], @"^\s*;(.*)$")) {
    if (Regex.IsMatch(lines[i], @"^(.*);(.*)$"))
        sb.AppendLine(lines[i].Substring(0, lines[i].IndexOf(';')).Trim());
    else
        sb.AppendLine(lines[i]);
}

当字符串不为空时输入if 它与正则表达式不匹配。这意味着你一直输入它,因为当第一部分为假(字符串为空)时,第二部分为真(空字符串与正则表达式不匹配。)

只需用AND替换OR。