2012-03-21 11 views
7

का उपयोग कर आंतरिक पैटर्न को दोबारा प्राप्त करें मुझे पता है कि .NET में regex रिकर्सन के बारे में कई प्रश्न हैं। मैं कुछ जटिल रेगेक्स एक्सप्रेशन लिख सकता हूं लेकिन यह रिकर्सन मेरे बाहर है, मैं इसे लिखने में सक्षम नहीं हूं।regex C#

यह मेरे प्रश्नों के निकटतम प्रश्न हैं।

first question,second question

लेकिन यह पूरी स्ट्रिंग से मेल खाता है, मैं चाहता हूं कि संग्रह में मैच पहले से ही सबसे पहले मैच या कुछ क्रम में। इसके अलावा यह एक उद्घाटन चरित्र और एक बंद चरित्र पर मेल खाता है। खुलने और बंद करने के लिए मेरा 2 अक्षर है, [! और!]

मेरी इनपुट स्ट्रिंग इस तरह कुछ होगी।

[!a='test' b='[!a='innertest' b='innervalue'!]'!] 

मैं innertest अनुभाग, [!a='innertest' b='innervalue'!], पहले खोजने की जरूरत है और फिर मेरी अभिव्यक्ति के पेड़ में से एक के माध्यम से मूल्यांकन करते हैं। फिर इसमें शामिल माता-पिता का मूल्यांकन करें।

क्या कोई इससे मदद कर सकता है?

^\[!((?<n>\w+='\[!)|(?<inner-n>!]')|\w+='(?!\[!)[^']*'|)*!](?!(n))$ 

यह क्रम में प्रत्येक आइटम के लिए अंतरतम आइटम दे देंगे:

उत्तर

11

यहाँ एक पैटर्न है कि आपकी आवश्यकताओं को पूरा हो सकता है। व्याख्या करने के लिए मैं क्या मतलब है, कोड दिया:

[!a='test' c='[!x='blah'!]' b='[!a='[!y='innermost'!]' b='innervalue'!]' !] 

यह (समूह "आंतरिक" के लिए कब्जा संग्रह में) निम्नलिखित मैचों दे देंगे: में प्रत्येक x=y आइटम के लिए,

x='blag' 
y='innermost' 
a='[!y='innermost'!]' b='innervalue' 

तो [! .. !], यह मैच को सबसे ऊपर से क्रम में देगा।

आप भी समग्र अभिव्यक्ति पर कब्जा कर लिया जा करने के लिए आप इसे इस प्रकार संशोधित कर सकते हैं चाहते हैं:

^(?<n>\[!)((?<n>\w+='\[!)|(?<inner-n>!]')|\w+='(?!\[!)[^']*'|)*(?<inner-n>!])(?!(n))$ 

देता है:

x='blag' 
y='innermost' 
a='[!y='innermost'!]' b='innervalue' 
a='test' c='[!x='blag'!]' b='[!a='[!y='innermost'!]' b='innervalue'!]' 

और regex व्याख्या करने के लिए:

^  # start of string 
\[!  # start of overall [! .. !] 
(  # either ... 
    (?<n>\w+='\[!)|  # a complex x='[! .. !]' containing a nested [! .. !] - push this onto the stack 'n' 
    (?<inner-n>!]')| # end of a nested [! .. !] - pop stack 'n', and capture the contents into 'inner' 
    \w+='(?!\[!)[^']*'| # a simple x='asdf' with no nested [! .. !] 
    )     # or a space 
*  # as many times as you want 
!]  # the end of the overall [! .. !] 
(?!(n)) # assert that the 'n' stack is empty, no mismatched [! .. !] 
$  # end of string 
+0

यह अच्छा लग रहा है..आपकी मदद के लिए धन्यवाद। मैं इसे आजमाने की कोशिश कर रहा हूं। ऑर्डर देने का कोई तरीका है, जैसा कि पहले सबसे पहले है, क्योंकि मुझे पहले इसका मूल्यांकन करना होगा। –

+0

सीधे नहीं। आप प्रत्येक कैप्चर के लिए 'कैप्चर.स्टार्ट' और 'कैप्चर.लेथेंथ' गुणों का उपयोग कर इसे काम कर सकते हैं, क्योंकि इससे आपको पता चल जाएगा कि कौन से कैप्चर में अन्य कैप्चर होते हैं। हालांकि, यदि प्रत्येक 'x =' ... '' केवल उस पर निर्भर करता है जो इसमें शामिल है, तो इस आदेश को ठीक काम करना चाहिए। – porges

+0

यह मेरे इच्छित होने के बहुत करीब है। आपके प्रयास के लिए धन्यवाद। आप एक प्रतिभा होना चाहिए !!! इस पर एक अंतिम सवाल। अगर मैं [!,!] के बजाय उद्घाटन और समापन टैग को [} और {] में बदलना चाहता हूं, तो \ w + = '(?! \ [!) [^'] * '| खंड परिवर्तन मैंने कुछ चीजों की कोशिश की लेकिन इसे कैप्चर नहीं कर रहा था। –