2011-05-14 9 views
7

मैं पूरी निम्नलिखित बयान से मेल खानी चाहिए:regex एम्बेडेड {{मिलान

{{CalendarCustom|year={{{year|{{#time:Y}}}}}|month=08|float=right}} 

असल में जब भी वहाँ है एक { वहाँ हालांकि कई एम्बेडेड { } मूल टैग के अंदर कर रहे हैं के साथ एक इसी } की जरूरत है। तो उदाहरण के लिए {{match}} या {{ma{{tch}}}} या {{m{{a{{t}}c}}h}}

(\{\{.+?(:?\}\}[^\{]+?\}\})) 

यह काफी नहीं काम करता है:

मैं अब इस अधिकार है।

+0

वास्तव में क्या आप स्ट्रिंग से बाहर निकलने की कोशिश कर रहे हैं? – Oded

+0

मैं सिर्फ पूरे कथन से मेल खाना चाहता हूं ताकि मैं इसे हटा सकूं। जैसा कि इसके आस-पास के अन्य पाठ हैं और मैं {} ब्रैकेट के अंदर कुछ भी मिलान करना चाहता हूं और इसे हटा देना चाहता हूं। – thirsty93

+2

सामान्य regexps ब्रैकेट से मेल खाने के लिए सही उपकरण नहीं हैं, देखें। जैसे [यहां] (http://stackoverflow.com/q/546433/577423)। – Howard

उत्तर

15

नेट regex इंजन पुनरावर्ती मिलान अनुमति देता है:

result = Regex.Match(subject, 
    @"\{     # opening { 
     (?>    # now match... 
      [^{}]+   # any characters except braces 
     |     # or 
      \{ (?<DEPTH>) # a {, increasing the depth counter 
     |     # or 
      \} (?<-DEPTH>) # a }, decreasing the depth counter 
     )*     # any number of times 
     (?(DEPTH)(?!))  # until the depth counter is zero again 
     \}     # then match the closing }", 
    RegexOptions.IgnorePatternWhitespace).Value; 
+0

इसे इंगित करने के लिए धन्यवाद। आज कुछ सीख लिया ... क्या आपके पास एक लिंक है जो '' दस्तावेज करता है? – Oded

+0

@ ओडेड: 'DEPTH' एक मनमाना नाम है - यह सिर्फ एक खाली नाम कैप्चरिंग समूह है '(? )' जो .NET में मैचों की संख्या की गणना करता है; '(?<-id>) 'वही है, काउंटर को कम करना। और '(? (आईडी) (?!)) 'आईडी आईडी काउंटर शून्य होने पर ही मेल खाता है। यह फ्रेडल के "मास्टरिंग नियमित अभिव्यक्तियों" के पृष्ठ 436 पर प्रलेखित है। –

+0

वह पुस्तक मेरे बुकशेल्फ़ पर है, पढ़ने की प्रतीक्षा कर रहा है ... – Oded

4

मैं इस के लिए एक साधारण पार्सर/टोकनेज़र लिखने का सुझाव देता हूं।

मूल रूप से, सभी वर्णों से अधिक आप पाश और { और } की घटनाओं की गणना शुरू - { के लिए incrementing और } के लिए decrementing। प्रत्येक पहले { की अनुक्रमणिका और प्रत्येक अंतिम } की अनुक्रमणिका रिकॉर्ड करें और आपके पास अपने एम्बेडेड अभिव्यक्तियों के लिए अनुक्रमणिका होगी।

इस बिंदु पर आप इन्हें प्राप्त करने के लिए substring का उपयोग कर सकते हैं और मूल स्ट्रिंग से उन्हें हटा सकते हैं।

this देखें प्रश्न और उत्तर क्यों RegEx उपयुक्त नहीं है।

+0

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

+0

अभिव्यक्तियों का विश्लेषण और मूल्यांकन करने के लिए एएनटीएलआर का उपयोग करने का एक बहुत ही सरल उदाहरण यहां दिया गया है। ध्यान दें कि यह निर्धारित करना कितना आसान है कि वैध 'टोकन' क्या हैं और फिर इनलाइन जावा स्रोत कोड में छिड़कते हैं (यह सी # के साथ भी काम करता है), और फिर एएनटीएलआर बाकी करता है। http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator –

+0

मैं ऐसा कुछ कर रहा हूं जो एक्सबॉक्स पर चलता है, इसलिए कोई अप्रबंधित कोड अनुमति नहीं है। – thirsty93

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