2012-08-11 15 views
5

से कक्षा गुणों का नाम, विधियों का नाम और फ़ील्ड का चयन करें, मैं मिलान करना चाहता हूं (कक्षा फ़ाइल से चयन करें) विधियों का नाम, गुणों का नाम और फ़ील्ड नाम।सी # रेगेक्स - कक्षा फ़ाइल (.cs)

यह उदाहरण वर्ग है:

class Perl 
{ 
    string _name; 
    public string Name { get; set; } 
    public Perl() 
    { 
    // Assign this._name 
    this._name = "Perl"; 
    // Assign _name 
    _name = "Sam"; 

    // The two forms reference the same field. 
    Console.WriteLine(this._name); 
    Console.WriteLine(_name); 
    } 
    public static string doSomething(string test) 
    { 
     bla test; 
    } 
} 

मैं तरीकों के लिए कोड मिला:

(?:public|private|protected)([\s\w]*)\s+(\w+)\s*\(\s*(?:\w+\s+(\w+)\s*,?\s*)+\) 

और मुझे पास प्रश्न:

  • इस ऊपर regex कोड सभी तरीकों और यह हो जाता है बहुत अच्छी तरह से काम करता है लेकिन भी मैं इसे विधि नाम चुनना चाहता हूं लेकिन पैरामीटर के बिना और एक्सेसर्स। मेरी कोड परिणाम का उपयोग करेंगे तो exaplmce वर्ग से:) पर्ल ( और DoSomething(): सार्वजनिक पर्ल() और सार्वजनिक स्थिर DoSomething (स्ट्रिंग परीक्षण) लेकिन मैं परिणाम उस तरह चाहते हैं। तो - मेरा कोड अच्छा मेल खाता है लेकिन मैं परिणाम को प्रदर्शित करना चाहता हूं जैसे कि पिछले वाक्य में लिखा था।
  • गुणों का चयन कैसे करें? परिणाम प्रदर्शित के साथ: प्रकार और संपत्ति नाम। तो एक्स्पल क्लास परिणाम से: स्ट्रिंग नाम
  • परिणाम के साथ फ़ील्ड का चयन कैसे करें: field_name टाइप करें। बाहर मामले में यह हो जाएगा: स्ट्रिंग नाम_
+1

[यह SO उत्तर] का डुप्लिकेट हो सकता है (http://stackoverflow.com/a/11647554/1495442) – Ria

+0

क्या यह कोड फ़ाइल पर रेगेक्स के बजाय संकलित कक्षा पर प्रतिबिंब का उपयोग करने के लिए समझ में आता है? आपको अधिक विश्वसनीय परिणाम मिलेंगे (यानी आपको चिंता करने की ज़रूरत नहीं है कि क्या आपका रेगेक्स कमांड हर संभावित मामले को कवर करता है), और इसका उपयोग किसी भी .NET भाषा के साथ किया जा सकता है, न केवल सी #। –

+0

तो मुझे .cs वर्ग फ़ाइलों के साथ फ़ोल्डर मिला। क्या मैं इसे "हवा में" संकलित कर सकता हूं और फिर प्रतिबिंब का उपयोग कर सकता हूं? कक्षा को गतिशील रूप से संकलित कैसे करें उदाहरण के लिए एक ऐसा फ़ंक्शन है जिसका मैं उपयोग कर सकता हूं? उदाहरण के लिए। बटन पर चयनित फ़ोल्डर में सभी सीएस फाइलों को कॉमाइल पर क्लिक करें? – born2fr4g

उत्तर

3

उपयोग इस Regex

तरीकों

(?:public\s|private\s|protected\s|internal\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>\w+)\s+(?<parameter>\w+)\s*,?\s*)+\) 

और समूहों methodName और parameterType और parameter नामित करने के लिए

और क्षेत्रों के लिए:

(?:public\s|private\s|protected\s)\s*(?:readonly\s+)?(?<type>\w+)\s+(?<name>\w+) 

और मिल type और name नाम के समूहों।

उदाहरण के लिए तरीकों के लिए अपने कोड इस तरह हो सकता है:

var inputString0 = "public void test(string name, out int value)\r\nvoid test(string name, int value)"; 
foreach (Match match in Regex.Matches(inputString0, @"(?:public\s|private\s|protected\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>[\w\?\[\]]+)\s+(?<parameter>\w+)\s*,?\s*)+\)")) 
{ 
    var methodName = match.Groups["methodName"].Value; 
    var typeParameterPair = new Dictionary<string, string>(); 
    int i = 0; 
    foreach (var capture in match.Groups["parameterType"].Captures) 
    { 
     typeParameterPair.Add(match.Groups["parameterType"].Captures[i].Value, match.Groups["parameter"].Captures[i].Value); 
     i++; 
    } 
} 

आप codeplex भी से Irony - .NET Language Implementation Kit उपयोग कर सकते हैं।

+0

लेकिन संपत्तियों और fileds के बारे में क्या? ;) – born2fr4g

+0

दृश्यता गुंजाइश 'आंतरिक' के बारे में क्या? –

+0

मैं विडंबना का उपयोग नहीं कर सकता;)। मैं अपने आवेदन में नेट 2.0 का उपयोग कर रहा हूँ। फ़ील्ड regex कोड के लिए धन्यवाद। मैं इसे गुणों से मिलान करने के लिए संशोधित करने की कोशिश करूंगा (** प्राप्त करने या सेट के साथ ** {} **) – born2fr4g

2

के रूप में अपने जवाब के लिए टिप्पणियों में कहा गया है, और अधिक विश्वसनीय विधि अपने .cs फ़ाइलें संकलन और उसके बाद सदस्यों को आप में रुचि रखते हैं के लिए प्रकार पूछताछ प्रतिबिंब का उपयोग करना है यह निम्न शामिल होगी:।

  1. उपयोग आपकी फ़ाइलों को संकलित करने के लिए सी # कंपाइलर (csc.exe)। एमएसडीएन में उपयोगी examples and hints शामिल है। आप इसे मैन्युअल रूप से कर सकते हैं, या, यदि आप पूरी चीज को स्वचालित करना चाहते हैं, तो आप Process class के साथ प्रोग्रामिंग रूप से csc.exe निष्पादित कर सकते हैं।
  2. परिणामस्वरूप असेंबली लोड करने के लिए Assembly.LoadFile() विधि का उपयोग करें।
  3. अब आप विधानसभा से get types पर प्रतिबिंब और interrogate पर प्रतिबिंबित कर सकते हैं।

संपादित करें: एक वैकल्पिक Csc.exe को रूप में, आप CodeDOM इस्तेमाल कर सकते हैं - वहाँ एक example कि आप सभी की जरूरत होती है।

+0

मैंने कुछ समय पहले इसी सवाल से पूछा कि प्रतिबिंब का उपयोग करके विधि के साथ उपयोग किए गए पैरामीटर मूल्यों को कैसे प्राप्त किया जाए लेकिन दुख की बात है कि कोई उपयोगी उत्तर नहीं था। क्या यह भी संभव है? क्योंकि रेगेक्स के बजाय जाने का रास्ता होगा। – formatc

+0

@ user1010609 मुझे नहीं लगता कि यह इस सवाल से कैसे संबंधित है - लेकिन लिंक पोस्ट करें और मैं इसे देख सकता हूं। –

+0

यह प्रासंगिक नहीं है, लेकिन मान लें कि वह इस तरह के कंसोल की तरह कुछ करना चाहता था। राइटलाइन (_name); ',' _name' मान क्या था? और अगर इसे कंसोल की तरह हार्डकोड किया गया था। राइटलाइन ("जॉन"); '? चूंकि रेगेक्स आसानी से ऐसा कर सकता है, लेकिन अन्य चीजों को और अधिक जटिल बनाता है, बस उसे सही दिशा में इंगित करना चाहता था। – formatc

0

सी # जैसी भाषाएं नियमित अभिव्यक्तियों का उपयोग करके पार्स किए जाने के लिए कथन वाक्यविन्यास में बहुत अधिक भिन्नताओं को स्वीकार करती हैं। Regexes के शीर्ष पर, आप एक प्रासंगिक व्याकरण पार्सर की जरूरत है।

मैं Roslyn एक कोशिश दूंगा: यह एक सी # कंपाइलर है जिसका आंतरिक आपके कोड से पहुंच योग्य है। Roslyn से कोड को पार्स करने के लिए कहें और आपको जो भी जानकारी चाहिए उसके बारे में पूछें।

0

मैं सुझाव देता हूं कि Microsoft.VisualStudio.CSharp.Services.Language नेमस्पेस और अन्य विजुअल स्टूडियो एक्सटेंसिबिलिटी कार्यक्षमता देखें। यह संकलन की आवश्यकता को खत्म कर देगा।