2013-03-20 38 views
0

我有一個帶混合NC代碼和C#代碼的文本文件。 C#代碼以「<#」開始,以「#>」結尾。 現在我需要一個正則表達式來查找所有NC-評論。一個問題是NC-Comments以「;」開頭因此我有一些問題來區分NC評論與「;」的C#代碼。正則表達式匹配混合C#字符串中的NC註釋 - 代碼

只有一個正則表達式可以實現嗎?

; 1. NC-Comment 
FUNCT_A; 
FUNCT_B; 

<# // C#-Code 
int temp = 42; 
string var = "hello"; // C#-Comment 
#> 

FUNCT_C ; 2. Comment 

<# // C#-Code 
for(int i = 0; i <10; i++) 
{ 
    Console.WriteLine(i.ToString()); 
} 
#> 

; 3. Comment 
FUNCT_D; 

正則表達式的結果應該是{1。 NC-註釋,註釋2,3,評論}

我打角落找尋與以下正則表達式:

1.) (;(.*?)\r?\n) --> Finds all NC-Comments but also C#-Code as comment 
2.) (#>.*?<#)|(#>.*) --> Finds all NC-Code except the first NC-Code fragment 
3.) #>.+?(?=<#) --> Finds all NC-Code except the first and last NC-Code fragment 

一種解決方案可能是每個「<#」推到堆棧和彈出每個「 #>「。所以如果堆棧是空的,那麼當前字符串是NC代碼。接下來,我必須知道這個字符串是否是NC評論。

+0

爲什麼使用一個複雜的緩慢的正則表達式時,你可以做同樣更簡單,更快,無正則表達式? – 2013-03-20 19:30:06

+0

這並不那麼簡單。如果C#代碼本身包含評論怎麼辦?如果您在C#註釋中有'<#' or '#>',該怎麼辦? – 2013-03-20 19:37:55

+0

如果沒有正則表達式,你會如何實現? – user1579585 2013-03-21 07:25:42

回答

1

我寧願做沒有正則表達式:

public static List<string> GetNCComments(Stream stream) 
{ 
    using (StreamReader sr = new StreamReader(stream)) 
    { 
     List<string> result = new List<string>(); 
     bool inCS = false; // are we in C# code? 
     int c; 
     while ((c = sr.Read()) != -1) 
     { 
      if (inCS) 
      { 
       switch ((char)c) 
       { 
        case '#': 
         if (sr.Peek() == '>') // end of C# block 
         { 
          sr.Read(); 
          inCS = false; 
         } 
         break; 
        case '/': 
         if (sr.Peek() == '/') // a C# comment 
          sr.ReadLine(); // skip the whole comment 
         break; 
       } 
      } 
      else 
      { 
       switch ((char)c) 
       { 
        case '<': 
         if (sr.Peek() == '#') // start of C# block 
         { 
          sr.Read(); 
          inCS = true; 
         } 
         break; 
        case ';': // NC comment 
         string comment = sr.ReadLine(); 
         if (!string.IsNullOrEmpty(comment)) 
          result.Add(comment); 
         break; 
       } 
      } 
     } 
     return result; 
    } 
} 

用法:

var comments = GetNCComments(new FileStream(filePath, FileMode.Open, FileAccess.Read)); 

的代碼很簡單,自我解釋。這也處理C#註釋,但不處理C#字符串。我的意思是,如果你在C#註釋中有#>,它可以正常工作。但是,如果你有一個C#字符串(不正確地認爲它是C#塊的結尾)的相同的東西不起作用。處理這種情況也很容易。