2013-05-06 10 views
8

तो मैं रेगेक्स की जबरदस्त दुनिया के लिए बिल्कुल नया हूं। असल में, मैं सिंटैक्स-हाइलाइटिंग (बीओडी से डीएम के लिए) के लिए एक नया कस्टम भाषा विनिर्देश (सी # से व्युत्पन्न) बनाने के लिए जीएडिट एपीआई का उपयोग कर रहा हूं। डीएम में बचने वाले पात्रों में, आपको [variable] का उपयोग बचने वाले वाक्यविन्यास के रूप में करना है, जो कि काफी आसान है। हालांकि, यह उदाहरण के लिए [सरणी/सूची [अनुक्रमणिका]] जैसे घोंसला भी लगाया जा सकता है। (यह असीम रूप से घोंसला जा सकता है।) मैंने अन्य प्रश्नों को देखा है, और जब वे नेस्टेड ब्रैकेट के बारे में पूछते हैं तो उनका मतलब केवल विशेष रूप से घोंसला होता है, जबकि इस मामले में यह या तो हो सकता है।नियमित अभिव्यक्तियां (सामान्य या नेस्टेड ब्रैकेट)

कई प्रयास मैं कोशिश की है:

  • \[.*\] परिणाम "टेस्ट [टेस्ट [टेस्ट] टेस्ट] टेस्ट [टेस्ट] टेस्ट"
  • \[.*?\] परिणाम पैदा करता है पैदा करता है "टेस्ट [टेस्ट [टेस्ट] टेस्ट] टेस्ट [टेस्ट] टेस्ट "
  • \[(?:.*)\]produces परिणाम" टेस्ट [टेस्ट [टेस्ट] टेस्ट] टेस्ट [टेस्ट] टेस्ट "
  • \[(?:(?!\[|\]).)*\]produces परिणाम" टेस्ट [टेस्ट [टेस्ट] टेस्ट] टेस्ट [टेस्ट] टेस्ट "। यह https://stackoverflow.com/a/9580978/2303154 से लिया गया है लेकिन ऊपर वर्णित की तरह, यह केवल तब मेल खाता है जब अंदर कोई ब्रैकेट न हो।

स्पष्ट रूप से मुझे कोई वास्तविक विचार नहीं है कि मैं यहां अधिक जटिल मिलान में क्या कर रहा हूं, लेकिन कम से कम मैं अन्य स्रोतों से अधिक बुनियादी परिचालनों को समझता हूं।

+3

ध्यान से [इस ट्यूटोरियल] को पढ़ना (http://www.regular-expressions.info/tutorial.html) रेगेक्स की दुनिया को बहुत कम भारी बनाता है। इसके अलावा, नेस्टेड संरचनाएं आमतौर पर होती हैं जहां रेगेक्स दृष्टिकोण गिरता है - केवल .NET के रेगेक्स स्वाद और पीसीआरई समर्थन संरचनाएं जो अनिश्चित घोंसले से निपट सकती हैं। –

+0

दुर्भाग्यवश चूंकि यह एक एपीआई है, मुझे नहीं लगता कि मैं अंतर कर सकता हूं और केवल जीडीआईटी के एक्सएमएल के मिलान के लिए क्या करना है, इसका उपयोग करना है; और हाँ, यह उन मुख्य ट्यूटोरियल में से एक था जिन्हें मैं देख रहा हूं। – Chaos7Theory

+0

आपके तीसरे और चौथे प्रयासों को वाक्य रचनात्मक रूप से विकृत किया गया था (इस प्रकार आपके टेस्ट स्ट्रिंग में कुछ भी मेल नहीं खाता)। मैंने उन्हें सही किया। # 3: आपका संस्करण '\ [(?:। *)) \]' में एक डुप्लिकेट समापन ब्रैकेट है। सुधार '\ [(?:। *) \]' # 1 के बराबर है। _non-capturing group_ '(?: ...) 'यहां कोई स्पष्ट उद्देश्य नहीं देता है। # 4: आपका संस्करण '\ [?: (?! \ [| \])। * \]' गैर-कैप्चरिंग समूह वाक्यविन्यास का खेल हिस्सा - '?:' - संबंधित ब्रैकेट के बिना '(...)'। '(?: (?! \ [| \])।) 'को' [^ \] \ []' में सरलीकृत किया जा सकता है (इस क्रम में charclass के वर्णों को सूचीबद्ध करते समय बैकस्लाश वैकल्पिक हैं: '[^] [] ')। –

उत्तर

1

@Chaos7Theory से:

GtkSourceView's Specification Reference पढ़ने पर, मैंने पता लगा है कि यह PCRE विशेष रूप से उपयोग करता है। तब मैंने इसे एक लीड के रूप में इस्तेमाल किया।

\[(([^\[\]]*|(?R))*)\]

मुझे आशा है कि यह भविष्य में किसी और में मदद करता है:

इसे में और परीक्षण और त्रुटि के माध्यम से खुदाई, मैं इसके साथ काम करने के लिए मिला है।

+0

@ Chaos7Theory: इस पर शोध करने और समाधान साझा करने के लिए धन्यवाद! @ एलेक्स: इसे उचित उत्तर में ले जाने के लिए धन्यवाद! –

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