कुछ regex इंजन (अच्छी तरह से, केवल पर्ल अब के रूप में, के रूप में तक मुझे पता है) बैक ट्रैकिंग से संबंधित क्रियाओं का समर्थन: (*PRUNE)
, (*SKIP)
, (?{doSomeCode();})
*, आदि मैं पहले से ही पता है कि इन क्रियाओं करते हैं, here से।रीजिक्स बैकट्रैकिंग नियंत्रण कब करना चाहिए, जैसे (* PRUNE), का उपयोग किया जाना चाहिए?
मुझे केवल पर्ल की एक बहुत ही बुनियादी समझ है (इसलिए यदि संभव हो तो जटिल पर्ल कोड पर निर्भर रहने से बचें), लेकिन मुझे पता है कि यह उस भाषा के रूप में जाना जाता है जो नई रेगेक्स सुविधाओं को अग्रणी बनाता है।
जो मैं समझता हूं उससे, पर्ल किसी अन्य भाषा की तुलना में रेगेक्स के साथ अधिक एकीकृत प्रतीत होता है। इस कारण से, यह समझ में आ सकता है कि इसकी अनिवार्य शैली अपने regexes में लीक हो गया है। अन्य भाषाओं में जो regexes है, भले ही लालची मूल्यांकन प्राथमिकता दी जाती है, regexes की अंतर्निहित शैली घोषणात्मक है (एसक्यूएल के समान)।
मुझे लगता है कि ये क्रियाएं कुछ हद तक गूढ़ हैं, या कम से कम एक निम्न स्तर के प्रोग्रामिंग के लिए एक अनावश्यक कदम हैं। एक (* PRUNE) की आवश्यकता के बजाय, यह दृश्यों के पीछे अधिक अनुकूलन (जैसे कंपाइलर या इंजन) के लिए बेहतर नहीं होगा (रेगेक्स लेखक/प्रोग्रामर और पाठक दोनों के लिए जटिलता को कम करना)?
तो, व्यावहारिक रूप से, रेगेक्स में बैकट्रैकिंग-संबंधित क्रिया को शामिल करने में किस स्थिति में उपयोगी है? क्या ऐसा करने का कोई फायदा है?
*
तकनीकी रूप से नहीं एक बैक ट्रैकिंग नियंत्रण क्रिया, कई उदाहरण है कि regexes में मनमाने ढंग से कोड निष्पादित को प्रभावित करता है या उलटे पांव लौटने से प्रभावित है कि एक तरह से यह करना है।
पृष्ठभूमि
the Perl regex tutorial के अनुसार, इन सुविधाओं प्रयोगात्मक हैं (और भविष्य में निकाला जा सकता है)। इसमें कोई आश्चर्य की बात नहीं है कि मैं इंटरनेट पर इन संरचनाओं के बारे में ज्यादा जानकारी नहीं पा रहा हूं (विशेष रूप से जब खोज अप्रासंगिक परिणामों से घिरा हुआ है जिसमें कोड के बाहर skip
या prune
है)। मैं शर्त लगाऊंगा कि इन क्रियाओं का उपयोग करने के लिए कई लोग रेगेक्स में पर्याप्त उन्नत हैं जो बस उनके बारे में नहीं जानते हैं।
विशेषताएं प्रयोगात्मक
विशेषताएं अस्पष्ट
विशेषताएं उन्नत हैं
हैं:
तो वहाँ वर्तमान में बड़े पैमाने पर इस्तेमाल को रोकने व्यावहारिक बाधाओं के एक नंबर रहे हैं उपर्युक्त 3 अंक ओबीवी हैं उत्सुक, इसलिए मुझे it's never useful because: 1, 2, or 3
से अधिक देने के उत्तर चाहिए। यदि संभव हो, तो इन क्रियाओं के लिए लेखकों के इरादे से कुछ पृष्ठभूमि देने का प्रयास करें, और/या साक्ष्य कि वे वास्तव में स्क्रैप किए जाएंगे (या उनके लिए एक और भविष्य योजना बनाई गई है)।
मुझे यह भी पता है कि closed (too opinion-based) question मौजूद है, लेकिन मुझे नहीं लगता कि यह प्रश्न भी राय आधारित है।मेरा मानना है कि दूसरा प्रश्न राय आधारित था क्योंकि उसने पूछा "है आप", जिसका अर्थ है कि उत्तर व्यक्ति से अलग होना चाहिए (मैं यह कहने का उत्तर लिख सकता था कि "नहीं, मैंने यह गलत नहीं किया है" लेकिन यह सहायक नहीं होगा)। मैं कहूंगा कि उस प्रश्न के लिए "हां" कहने का एकमात्र उत्तर दो लिंक देता है, जिनमें से एक एक गूढ़ उपयोग था (इसके अतिरिक्त, मैं इसे समझ नहीं सकता ...)। दूसरा, जबकि (*FAIL)
का उपयोग करने की स्थिति दी गई, मैंने किसी भी अन्य संरचनाओं का उल्लेख नहीं किया, और न ही (*FAIL)
बैकट्रैकिंग तंत्र के रूप में उपयोग किया। जो मैं समझता हूं, (*FAIL)
any regex that always fails द्वारा अनुकरण किया जा सकता है।
मुझे respecify क्या मैं एक जवाब में रहा हूँ करते हैं:
- संबंधित विशेष रूप से
- गैर गूढ़
- प्रैक्टिकल
- अधिक उलटे पांव लौटने उपयोग का एक उदाहरण से
- एक है करने के लिए
- दिए गए किसी भी उदाहरण के लिए स्पष्टीकरण जोड़ने के कारण पर पृष्ठभूमि शामिल हो सकता है
- स्रोतों के साथ अद्यतन,, सुविधाओं के भविष्य के लिए प्रासंगिक (पर्ल या अन्य regex स्वादों में) शामिल हो सकते हैं प्रलेखन आप section about directives in Parse::RecDescent है देख सकते हैं की
संभावित डुप्लिकेट [क्या आपने अभी तक अपने regexes में पर्ल 5.10 बैकट्रैकिंग नियंत्रण क्रियाओं का उपयोग किया है?] (Http://stackoverflow.com/questions/253760/have-you-used-the-perl-5-10-backtracking -control-verbs-in-your-regexes-yet) – miken32
मैं यह देखने में असफल रहा कि यह प्रश्न कैसे है ("तो, किस स्थिति में एक रेगेक्स में बैकट्रैकिंग से संबंधित क्रिया शामिल करना उपयोगी है?") अलग है जुड़ा हुआ, और सही ढंग से बंद एक ("क्या आपने अभी तक अपने regexes में पर्ल 5.10 बैकट्रैकिंग नियंत्रण क्रियाओं का उपयोग किया है? और उन्होंने आपको किस समस्या में मदद की [हल]?") – miken32
@ miken32 मैंने अपने प्रश्न को और अधिक विस्तृत स्पष्टीकरण के साथ अपडेट किया यह सवाल का जवाब नहीं देता है। क्या यह अब स्पष्ट है कि मैं जो पूछ रहा हूं वह अलग है? मैं उदाहरण के लिए _just_ नहीं पूछ रहा हूँ। – Laurel