2010-04-24 9 views
8

कुछ इस तरह:
http://perl.plover.com/yak/regex/samples/slide083.htmlemacs: क्या emacs regex के साथ संतुलित माता-पिता के साथ तारों से मिलान करना संभव है?

दूसरे शब्दों मैं { { foo } { bar} } पर सफलतापूर्वक मिलान करना चाहते हों, लेकिन { { foo } पर नहीं।

मुझे लगता है कि यह perl, and in .NET में संभव है। क्या यह emacs regex में संभव है?

+1

हेक्टेयर! तो मजाकिया है। जैसे-जैसे मैं इस पर अधिक संकेतों की खोज करता हूं, Google में "emacs regex संतुलित" टाइप करना, मुझे यह प्रश्न * पहली हिट के रूप में मिलता है। हे हे। – Cheeso

उत्तर

7

नहीं, अब तक पर्ल/पीसीआरई और .NET एकमात्र रेगेक्स स्वाद हैं जो मनमाने ढंग से घोंसले (पुनरावर्ती पैटर्न) का समर्थन करते हैं।

+0

एमएमके, आपको एक उत्थान मिलता है भले ही यह वह जवाब नहीं है जिसे मैं चाहता था। – Cheeso

+0

हाँ, क्षमा करें। लेकिन मुझे यकीन नहीं है कि अगर रिकर्सिव रेगेक्स एक अच्छी बात है। वे पहले से ही जटिल बिना जटिल हो सकते हैं। रेगेक्स के साथ संयुक्त एक पार्सर मेरे लिए अधिक समझदार दिखता है। –

+1

मेह! "नियमित अभिव्यक्ति" जो इस बिंदु तक बढ़ा दी गई हैं कि वे ऐसा कर सकते हैं वास्तव में अब "नियमित" नहीं हैं। यह नहीं कि यह एक बुरी चीज है, जरूरी है, लेकिन उपकरण के विकास ने शब्दावली को अप्रचलित बना दिया है। – dmckee

2

नहीं, लेकिन यदि आपके पास चर्चा करने के लिए एक विशेष उपयोग केस है तो आपको अक्सर पता चलेगा कि आपको regexes की आवश्यकता नहीं है। माता-पिता से मेल खाने के लिए सरल राज्य-मशीन लिस्प में लिखना बहुत आसान है। पेरेडिट के स्रोत को देखना शुरू करने के लिए एक अच्छी जगह है।

+0

हां, ठीक है मेरे मामले में माता-पिता पार्सिंग पहले ही हो चुकी है। यह सीसी-मोड के भीतर है, इसलिए मैं किसी भी तरफ रेगेक्स मिलान के साथ '(फॉरवर्ड-सेक्सपी)' का उपयोग कर सकता हूं। मैं बस एक ही regex के साथ ऐसा करने में सक्षम होने की उम्मीद कर रहा था। – Cheeso

1

यदि आप अभी भी रुचि रखते हैं तो cexp.el पर एक नज़र डालें।

यह सिर्फ एक हैक है लेकिन शायद आपके उद्देश्य की सेवा करता है।

आप cexp-search-forward के साथ संयुक्त नियमित और संतुलित अभिव्यक्तियों की खोज कर सकते हैं। अंतर्निहित re-search-forward नियमित अभिव्यक्तियों के लिए उपयोग किया जाता है और इसलिए इसके वाक्यविन्यास नियम लागू होते हैं। संतुलित अभिव्यक्तियों को अतिरिक्त वाक्यविन्यास तत्व \!( और \!) से मिलान किया जा सकता है।

सबसे गंभीर प्रतिबंध यह है कि समूहों में संतुलित अभिव्यक्तियां नहीं हो सकती हैं। तो \!(^{ \(\!(^{.*}$\!)\)+ }$\!) जैसे निर्माण आंतरिक संतुलित अभिव्यक्ति वाले समूह की वजह से काम नहीं करता है।

फिर भी, एक उपयोगी उदाहरण की तरह

\\def\\[[:alpha:]]+\(#[0-9]\)*\!(^{.*}$\!) 

तरह

\def\mdo#1{{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next} 
संयुक्त भाव के साथ

मिलान है टेक्स-परिभाषाएँ ऊपर cexp साथ cexp-खोज-आगे के माध्यम से खोज के लिए सीमा रिटर्न निम्नलिखित समूह:

  1. पूर्ण मिलान की शुरुआत और अंत
  2. संतुलित अभिव्यक्ति से पहले नियमित अभिव्यक्ति के लिए मैच की सीमा, यानी पहले नियमित अभिव्यक्ति में कब्जा समूह के \def\mdo#1
  3. सीमा, यानी, #1
  4. संतुलित अभिव्यक्ति की सीमा, यानी, {{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}
+0

संदर्भित पृष्ठ से कुछ अंश के साथ अपना उत्तर विस्तारित करने पर विचार करें। देखें [कैसे जवाब दें] (http://stackoverflow.com/questions/how-to-answer) विवरण के लिए क्यों नंगे लिंक अच्छे उत्तरों नहीं मानते हैं। – bytebuster

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