2016-04-11 17 views
0

C# 'da RegEx' i kullanarak tüm sınıf metnini bulmakta sorun yaşıyorum. Dinamik kod olarak (CSharpCodeProvider nesnesini kullanarak) derleneceğinden, son paranteze "public class ..." dahil olmak üzere tüm yapıya ihtiyacım var. Tüm sınıfta bulmak için RegEx C#

[Worker("Structure")] 
    public class DataSourceStructure 
    { 
     DataSet mainData = new DataSet(); 
     DataTable worker = new DataTable("Worker"); 
     DataTable year = new DataTable("Year"); 

     public DataSet MainSource 
     {  
      get 
      { 
      worker.Columns.Add("Name"); 
      worker.Columns.Add("MonthSallary"); 
      worker.Columns.Add("DateOfBirth"); 
      worker.Columns.Add("WorkDescription"); 
      worker.Columns.Add("Sex"); 
      worker.Columns.Add("Worker_Id", typeof(int)); 

      year.Columns.Add("YearOfEmployment"); 
      year.Columns.Add("Worker_Id", typeof(int)); 

      mainData.Tables.Add(worker); 
      mainData.Tables.Add(year); 

      DataRelation rel = new DataRelation("Worker_Year", mainData.Tables["Worker"].Columns["Worker_Id"], mainData.Tables["Year"].Columns["Worker_Id"], true); 

      mainData.Relations.Add(rel); 

      return mainData; 
      } 
      set 
      { 
      mainData = value; 
      } 
     } 
    } 

I (örneğin: Using RegEx to balance match parenthesis) StackOverflow'daki açıklanan bazı yollar denedi: Burada

benim sınıfının örnek kod, ama benim için çalışmıyor ... ya bilmiyorum doğru şekilde nasıl yeniden oluşturulur./

Her yardım için şimdiden teşekkür ederiz.

+0

Dosya başına bir sınıfınız var mı? –

+0

Maalesef hayır - birçok sınıf ve özellik tanımları vardır. –

+0

(public class. *}) \ S + \ b \ w + \ b class 'singleLine seçeneğini kullanarak? –

cevap

1

Düzenli bir ifade her zaman kullanım durumunuz için çalışmayacaktır. Bunun nedeni, C# dilbilgisinin oldukça karmaşık olması (context-free with some context specific rules) ve düzenli bir ifadenin yalnızca regular grammars'u ifade edebilmesi/ayrıştırabilmesidir.

Bunun yerine Roslyn kullanmayı düşünün. Here, başlamanıza yardımcı olacak bir öğretici ve basit bir kod snippet'idir.

var code = new StreamReader("path/to/cs/file/here").ReadToEnd(); 
var tree = SyntaxTree.ParseCompilationUnit(code); 
var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>(); 

Bu yardımcı olur umarız!

+0

Sınıf kapanış parantezlerinden sonra başka bir sınıf veya başka bir şey varsa ne olur? –

+0

ananthonline - Cevabınız için çok teşekkür ederim, ancak bu görevi gerçekleştirmek için herhangi bir harici DLL kullanamıyoruz. –

+0

Roslyn ayrıştırıcısı C# derleyicide kullanılır. Tüm bu koşulları ve daha fazlasını ele alacak kadar sağlam. – Ani

İlgili konular