2012-12-12 15 views
5

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

वाक्यविन्यास एएसपी के समान है, जहां एक स्क्रिप्ट <% से शुरू होती है और%> के साथ समाप्त होती है।

यह केवल एक कमांड "पीआर" का समर्थन करता है, जो इको या Response.Write जैसा ही है।

अभी मैं स्क्रिप्ट अवरोध खोजने के लिए इस नियमित अभिव्यक्ति का उपयोग कर रहा:

(<%\s*([\s\S]*?)\s*%>) 

लेकिन अगर मैं इस तरह एक आदेश है:

<% pr "%>"; %> 

... यह स्पष्ट रूप से केवल मेल खाता है:

<% pr "%> 

उद्धरण के भीतर बंद टैग को अनदेखा करने के लिए शुद्ध रेगेक्स का उपयोग करने का कोई तरीका है? मेरी मुख्य चिंता यह है कि यह उद्धरणों के बीच टैग से मेल खा सकता है, लेकिन वास्तव में उनमें से बाहर, अगर यह समझ में आता है। उदाहरण के लिए ...

<% pr "hello world"; %> " 

तकनीकी तौर पर बंद टैग उद्धरण से घिरा हुआ है, लेकिन यह एक तो "खुला" "बंद" उद्धरण के अंदर नहीं है, दूसरी तरह के आसपास नहीं बल्कि।

यदि यह रेगेक्स के साथ संभव है जो बहुत साफ होगा, अन्यथा मुझे संदेह है कि अगर मैं इस कार्यक्षमता का समर्थन करना चाहता हूं तो मुझे आने वाले पाठ के माध्यम से मैन्युअल रूप से पुन: सक्रिय करना होगा और ब्लॉक को अपने आप को पार्स करना होगा, जो वास्तव में कोई बड़ा सौदा नहीं है या तो।

धन्यवाद!

+0

यदि आपका उद्धरण मेल नहीं खाते हैं, यह असंभव है। उदाहरण के लिए, आपका आखिरी उदाहरण क्यों नहीं होना चाहिए "<% pr" हैलो वर्ल्ड ";%>" '। उद्धरण के अंदर या बाहर दोनों '<%' and '%> 'नहीं हैं? क्या आप आश्वस्त कर सकते हैं कि आपके आखिरी उदाहरण में, पिछला '' 'इनपुट में बाद में मिलान किया जाएगा? –

उत्तर

3

मुझे लगता है कि यह आपकी आवश्यकताओं के अनुरूप होना चाहिए: <%(".*?"|.*?)*?%> (Demo देखें)।

स्पष्टीकरण:

जबकि .* मैचों जब तक संभव हो, .*? मैचों संभव रूप में छोटे रूप।

उदाहरण (छद्म कोड का प्रयोग करके) के लिए, जबकि

"#foo# #bar#".matches(/#(.*)#/).group(1) // will return ["foo# #bar"] 

"#foo# #bar#".matches(/#(.*?)#/).group(1) // will return ["foo", "bar"] 
+1

यह बहुत अच्छी तरह से काम करता है! मैंने इसे नए लाइन वर्णों को शामिल करने के लिए थोड़ा सा मालिश किया और मुझे आवश्यक कैप्चरिंग समूह जोड़ें और ऐसा लगता है महान काम करो। – ARW

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