2011-12-06 5 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文で& &と "\ n"の代わりに "\ r \ 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(); 

それともきゅうとし、これを試してみてください表現:文字列があるとき

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

あなたがLinqソリューションの方が早かったからです。 – stema

+1

メソッドAppendLine()を呼び出すため、余分な行が追加されます。 Append()を呼び出すと、これは起こりませんが、for-loopに改行を入力する必要があります。または、結果から最後の改行を削除するだけです。 – 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を入力します。空でないOR正規表現と一致しません。つまり、最初の部分が偽(文字列が空)の場合は2番目が真(空の文字列が正規表現と一致しないため)です。

ORをAND 。

+0

ええ、今私はそれをもう一度見て、それは意味をなさない。ところで、StringBuilderが余分な行を追加する理由を知りたいですか? – david

関連する問題