2011-12-06 4 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(); 

또는 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

완벽하게 작동합니다. 감사합니다. BTW, 왜 StringBuilder가 추가 선을 추가하는지 알 수 있습니까? 텍스트를 바꿀 때 추가 선이 추가됩니다. – david

+0

+1 당신이 더 빠르고 Linq 솔루션 때문입니다. – stema

+1

AppendLine() 메서드를 호출하기 때문에 추가 선이 추가됩니다. Append()를 호출하면 발생하지 않지만 for 루프에 개행 문자를 입력하여 입력 행을 유지해야합니다. 또는 결과에서 마지막 줄 바꿈을 제거하면됩니다. – Abbas

1

당신은 문자열이있을 때 당신은 if를 입력

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]); 
} 

여기 논리에 문제가 비어 있지 않음 또는 정규 표현식과 일치하지 않습니다. 즉, 첫 번째 부분이 거짓 (문자열이 비어있는 경우)이고 두 번째가 참 (공 문자열이 정규 표현식과 일치하지 않음)이기 때문에 항상 입력해야 함을 의미합니다.

OR을 AND .

+0

그래, 내가 다시 보니 이제는 말이 안된다. BTW, 왜 StringBuilder가 추가 선을 추가하는지 알 수 있습니까? – david