2012-02-02 20 views
11

से सभी टिप्पणी (एकल-/बहु-रेखा) और रिक्त रेखाएं निकालें I C# स्रोत फ़ाइल से सभी टिप्पणियां और रिक्त रेखाएं कैसे हटा सकते हैं। ध्यान रखें कि घोंसला वाली टिप्पणियां हो सकती हैं। कुछ उदाहरण:स्रोत टिप्पणी

string text = @"//not a comment"; // a comment 

/* multiline 
comment */ string newText = "/*not a comment*/"; // a comment 

/* multiline // not a comment 
/* comment */ string anotherText = "/* not a comment */ // some text here\"// not a comment"; // a comment 

हम ऊपर दिए गए तीन उदाहरणों की तुलना में अधिक जटिल स्रोत प्राप्त कर सकते हैं। क्या कोई इसे हल करने के लिए रेगेक्स पैटर्न या अन्य तरीका सुझा सकता है। मैंने पहले से ही इंटरनेट पर बहुत सारी चीजें ब्राउज़ की हैं और काम करने वाली किसी चीज़ को नहीं मिला है।

+3

आप स्रोत कोड से टिप्पणी क्यों हटाना चाहते हैं ?? –

+0

@ रॉय डिक्टस: हाँ, आमतौर पर टिप्पणियों को हटाने का बुरा विचार है! यह स्कूल से एक स्ट्रिंग मुश्किल काम है। :) – nenito

+0

आप सही हैं, इंटरनेट पर कुछ भी नहीं है, इसलिए आपको अपना होमवर्क करना होगा। – Cosmin

उत्तर

5

टिप्पणियों को निकालने के लिए this answer देखते हैं। उसके बाद, खाली लाइनों को हटा देना तुच्छ है।

+0

यह काम करता है! धन्यवाद! – nenito

+0

@ एननीटो, मुझे लगता है कि मैंने अपना जवाब थोड़ा देर से पोस्ट किया है, लेकिन यह वैसे भी ब्याज का हो सकता है। – Qtax

+0

हम अभी भी उत्सुक हैं कि आप टिप्पणियां क्यों हटाना चाहते हैं! (या कम से कम मैं हूं) – comecme

1

दुर्भाग्य से किनारे के मामलों के बिना रेगेक्स के साथ भरोसेमंद करना वास्तव में मुश्किल है। मैंने बहुत दूर जांच की है लेकिन आप टिप्पणियों को पार्स करने के लिए Visual Studio Language Services का उपयोग करने में सक्षम हो सकते हैं।

0

सबसे पहले, आप अपने RegEx उदाहरण का निर्माण करते समय RegexOptions.SingleLine का उपयोग करना चाहेंगे। अभी, आप कोड की एकल पंक्तियों को संसाधित कर रहे हैं।

RegexOptions.SingleLine विकल्प का उपयोग करते हुए बधाई के लिए, आप आप (क्रमशः ^ और $) start and end string anchors उपयोग करते हैं, के रूप में विशिष्ट मामलों आप के लिए, आप नियमित अभिव्यक्ति पूरे करने के लिए लागू करना चाहते हैं सुनिश्चित करने के लिए चाहता हूँ स्ट्रिंग।

मैं छोटे मामलों को संभालने के लिए शर्तों को तोड़ने और alternation का उपयोग करने की सिफारिश करता हूं, छोटे, आसान-से-प्रबंधित अभिव्यक्तियों से एक बड़ी नियमित अभिव्यक्ति का निर्माण करता हूं।

अंत में, मुझे पता है कि यह होमवर्क है, लेकिन नियमित अभिव्यक्तियों के साथ एक सॉफ्टवेयर भाषा का विश्लेषण करना व्यर्थता में एक अभ्यास है (यह एक व्यावहारिक अनुप्रयोग नहीं है)। यह अधिक संरचित डेटा के लिए बेहतर है। यदि आप भविष्य में पाते हैं तो आप इस तरह की चीजें करना चाहते हैं, भाषा के लिए बनाया गया एक पार्सर का उपयोग करें, (इस मामले में, मैं अत्यधिकRoslyn की अनुशंसा करता हूं)।

+0

मुझे अंतिम पैराग्राफ के साथ खो दिया ... मुझे टिप्पणियों को अलग करने के अलावा, रेगेक्स का उपयोग करके मेरे सी # लेक्सर को लागू करने में कोई दिक्कत नहीं हुई है। मुझे लगता है कि टिप्पणियां प्रक्रिया का एक अनूठा हिस्सा हैं, क्योंकि वे टोकन में योगदान नहीं देते हैं जो वाक्यविन्यास को पारित किया जाना चाहिए। http://en.wikipedia.org/wiki/Regular_language – Vreenak

1

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

यह आपको संदर्भ के साथ समस्याओं के आसपास ले जाता है। यदि आप स्ट्रिंग के बीच में चीजों को देखने की कोशिश कर रहे हैं, तो यह पहचानने का कोई अच्छा तरीका नहीं है कि कोई विशेष "टिप्पणी" स्ट्रिंग के अंदर या नहीं है - वास्तव में, यह पहचानना मुश्किल है कि स्ट्रिंग अक्षर कहां हैं पहली जगह, \" जैसी चीजों के कारण। लेकिन यदि आप हमेशा स्ट्रिंग में पहली चीज लेते हैं, तो यह कहना आसान है "ओह, स्ट्रिंग " के साथ शुरू होती है, इसलिए अगले अनपेक्षित " तक सबकुछ अधिक स्ट्रिंग है।" संदर्भ स्वयं का ख्याल रखता है।

तो तुम तीन regexes चाहेगा:

  • एक यह है कि एक टिप्पणी स्ट्रिंग की शुरुआत में शुरू की पहचान करता है (या तो एक // या एक /* टिप्पणी)।
  • वह जो स्ट्रिंग की शुरुआत में प्रारंभिक स्ट्रिंग अक्षर की पहचान करता है। " और @" स्ट्रिंग दोनों की जांच करना याद रखें; प्रत्येक के अपने किनारे के मामले हैं।
  • है कि कुछ है कि ऊपर से कोई भी पहचान लेती है और पहली बात यह है कि एक टिप्पणी या एक स्ट्रिंग शाब्दिक हो सकता है जब तक ऊपर से मेल खाता है एक।

वास्तविक रेगेक्स पैटर्न लिखना पाठक के लिए एक अभ्यास के रूप में छोड़ा गया है, क्योंकि इसे लिखने और परीक्षण करने में घंटों लगेंगे और मैं इसे मुफ्त में करने के लिए तैयार नहीं हूं। (grin) लेकिन यह निश्चित रूप से करने योग्य है, अगर आपको regexes की अच्छी समझ है (या स्टैक ओवरव्लो जैसी जगह है तो आप विशिष्ट प्रश्न पूछने के लिए पूछें) और अपने कोड के लिए स्वचालित परीक्षणों का एक गुच्छा लिखने के इच्छुक हैं। , है कि पिछले ("कुछ और") के मामले पर ध्यान यद्यपि - आप अगर यह एक " द्वारा पीछा किया है एक @ से पहले सिर्फ बंद करना चाहते हैं, लेकिन नहीं है कि यह एक कीवर्ड एक पहचानकर्ता के रूप में उपयोग करने के लिए भागने के @ हो चुका है।

2

आप this answer में समारोह इस्तेमाल कर सकते हैं:

static string StripComments(string code) 
{ 
    var re = @"(@(?:""[^""]*"")+|""(?:[^""\n\\]+|\\.)*""|'(?:[^'\n\\]+|\\.)*')|//.*|/\*(?s:.*?)\*/"; 
    return Regex.Replace(code, re, "$1"); 
} 

और फिर खाली लाइनों को हटा दें।

+0

पर अपने कोड को सभी टिप्पणियों के साथ स्टोर कर सकते हैं। काम नहीं। // स्ट्रिंग में भी हटा दिया गया। –

+0

@Mohsen असीमित, जो मैं देख सकता हूं। उदाहरण: http://ideone.com/PVCdm कृपया अपना दावा प्रदर्शित करें। – Qtax

1

इसके अलावा सी # कोड minification के लिए अपने प्रोजेक्ट देखें: CSharp-Minifier

टिप्पणी, रिक्त स्थान और और कोड से पंक्ति विराम के दूर करने के अलावा, वर्तमान समय में यह स्थानीय चर नाम सेक और एक अन्य minifications ऐसा करने में सक्षम है।

+0

यह वास्तव में अच्छी चीजें है;) लेकिन जीयूआई उपयोग के लिए सुविधाजनक नहीं है (ऐसा लगता है, जैसे यह केवल लेखक के उद्देश्यों के लिए लिखा गया था), लेकिन एक रैपर बनाने में मुश्किल नहीं है: – maxkoryukov

+0

https://gist.github.com/ maxkoryukov/20ba5df3f1453d003efd69783d777657 – maxkoryukov

+0

मैंने रैपर का परीक्षण एक छोटे से वास्तविक अनुप्रयोग (दो परियोजनाओं, लगभग 40-50 फाइलों) पर किया है, और संशोधनों के बिना कोड संकलन – maxkoryukov

-1

सबसे टिप्पणियों को हटाने के लिए अपने प्रोजेक्ट का प्रयोग करें। https://github.com/SynAppsDevelopment/CommentRemover

यह रीडमे और स्रोत में समझाए गए जटिल टिप्पणियों के लिए कुछ सीमाओं के साथ सभी पूर्ण-रेखा, समाप्ति रेखा और एक्सएमएल दस्तावेज़ कोड टिप्पणियों को हटा देता है। यह WinForms इंटरफेस के साथ एक सी # समाधान है।

+0

कृपया कुछ टूल या लाइब्रेरी को उत्तर के रूप में पोस्ट न करें। उत्तर में कम से कम प्रदर्शन [यह समस्या कैसे हल करता है] (http://meta.stackoverflow.com/a/251605)। – paper1111

+0

क्षमा करें, सभी दिशानिर्देशों को नहीं पता था। क्या मेरी संपादन में मदद मिली? – Jowe

संबंधित मुद्दे