2013-04-23 6 views
9

regex का उपयोग करके इस पैटर्न को कैसे खोजें?सी शैली ब्लॉक टिप्पणियों को खोजने के लिए नियमित अभिव्यक्ति

सी शैली ब्लॉक टिप्पणियां

/* xxxxxxxxxxxx */

+0

क्या होगा यदि '/ *' एक ही पंक्ति पर है और '//' के बाद, जिसका अर्थ है कि यह कोई टिप्पणी शुरू नहीं करता है? – Patashu

+0

नहीं, मुझे ऐसी स्थिति को संभालने की आवश्यकता नहीं है – linquize

+0

नियमित अभिव्यक्तियों का उपयोग करने के अलावा, यदि आप सभी बाहर जाना चाहते हैं तो आप सी (या जो भी) भाषा व्याकरण के साथ एक भाषा पार्सर का उपयोग कर सकते हैं। उदाहरण हैं yacc, javacc, antlr –

उत्तर

1

मैं अत्यधिक सिर्फ एक पार्सर का उपयोग करना चाहिये, टिप्पणी की तरह है, लेकिन अगर सिर्फ मनोरंजन के लिए - मेरे सिर के ऊपर से, आप गहरे लाल रंग का उपयोग करते हुए कुछ इस तरह कर सकता है, यह मानते हुए कि आप पहले से ही कैसे एक फ़ाइल से सामग्री प्राप्त करने जानते हैं (ध्यान में रखना यह बहुत ही किसी न किसी और सिर्फ एक संभव गाइड है - prolly बॉक्स से बाहर काम नहीं करेगा):

def one_liner_comment string 
    string.match /\/\*.*\*\// 
end 

def multi_liner_comment_start string 
    # if always checking for one_liner_comment in code would not need first !one_... 
    !one_liner_comment(string) && string.match(/\/\*/) 
end 

def multi_liner_comment_end string 
# if always checking for one_liner_comment in code would not need first !one_... 
!one_liner_comment(string) && string.match(/\*\//) 
end 

फिर निर्धारित करने के लिए जहां आप बस कर रहे हैं

if one_liner(string) 
    inline = true 
elsif multi_liner_comment_start(string) 
    started = true 
elsif started && multi_liner_comment_end(string) 
    ended = true 
end 

फिर यहां से अपनी टिप्पणियों के साथ जो भी करना चाहते हैं उसे निष्पादित करें।

if inline 
    # do whatever you want 
    one_liner = false 
elsif started && !ended 
    # do whatever you want -> append or create new string 
elsif started && ended 
    # do whatever you want -> append to string 
    started = false 
    ended = false 
end 

ज़रूर यह भी साफ किया जा सकता है ...

20

\/\*(\*(?!\/)|[^*])*\*\/ 

का उपयोग कर एक पंक्ति और बहु ​​लाइन ब्लॉक टिप्पणियों पर कब्जा करने की कोशिश करो। यह /* या तो के किसी भी संख्या के बाद की खोज करता है:

  • एक * कि एक /
  • किसी भी चार द्वारा पीछा नहीं कर रहा है, सिवाय इसके*

और फिर समापन */ फिर से।

+0

आपको एक अलग शाखा में व्हाइटस्पेस वर्णों से मेल खाने की आवश्यकता नहीं है; '[^ * /]' उन्हें कवर किया गया है। सभी '| \ s' आपको [आपदाजनक बैकट्रैकिंग] (http://www.regular-expressions.info/catastrophic.html) तक खुलता है। साथ ही, आपको वहां से उस स्लैश को प्राप्त करने की आवश्यकता है, या आपका रेगेक्स उनके अंदर स्लेश के साथ टिप्पणियों से मेल नहीं खा पाएगा। –

+0

आपके सुझावों में बदल गया (हालांकि ओपी ने कहा, स्लेश के साथ टिप्पणियां कोई समस्या नहीं लगती हैं) – Campfire

+0

क्यों नहीं '/\*(.(?!\*/))*\*/'? पहले एक '/ *' फिर किसी भी चरित्र के बाद '* /' के बाद '* /' – zzh1996

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