2011-12-06 90 views
1

我正在使用WinForms NET 2.0。我正在编写一个小函数来修剪某些选定文本的注释。它所做的是将所选文本分为单独的行,然后:C#删除字符串中的注释

  • 如果行不包含注释,则会附加它。
  • 如果该行包含一些文本后跟注释,则会附加修剪的注释。
  • 如果该行以注释开头,则不会被追加。这是在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追加了一行。如何摆脱这一点?

+0

在'tb.SelectedTExt'是'\ n'绝对唯一的换行符?例如,它不是'\ r \ n'? –

+0

它总是\ n。 – david

回答

3

替换||在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(); 
+0

完美的作品,谢谢。顺便说一句,你会碰巧知道为什么StringBuilder会追加一个额外的行吗?当我替换文本时,会添加额外的行。 – david

+0

+1,因为你更快,并为Linq解决方案。 – stema

+1

由于您调用方法AppendLine(),所以添加了额外的行。如果你调用Append(),这不会发生,但你必须在for循环中提供一个换行符来保留输入的行。或者从结果中删除最后一个换行符。 – Abbas

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替换为AND 。

+0

是的,现在我再次看它,这是没有意义的。顺便说一句,你会碰巧知道为什么StringBuilder会追加一个额外的行吗? – david