2016-03-23 5 views
8

कुछ regex इंजन (अच्छी तरह से, केवल पर्ल अब के रूप में, के रूप में तक मुझे पता है) बैक ट्रैकिंग से संबंधित क्रियाओं का समर्थन: (*PRUNE), (*SKIP), (?{doSomeCode();}) *, आदि मैं पहले से ही पता है कि इन क्रियाओं करते हैं, here से।रीजिक्स बैकट्रैकिंग नियंत्रण कब करना चाहिए, जैसे (* PRUNE), का उपयोग किया जाना चाहिए?

मुझे केवल पर्ल की एक बहुत ही बुनियादी समझ है (इसलिए यदि संभव हो तो जटिल पर्ल कोड पर निर्भर रहने से बचें), लेकिन मुझे पता है कि यह उस भाषा के रूप में जाना जाता है जो नई रेगेक्स सुविधाओं को अग्रणी बनाता है।

जो मैं समझता हूं उससे, पर्ल किसी अन्य भाषा की तुलना में रेगेक्स के साथ अधिक एकीकृत प्रतीत होता है। इस कारण से, यह समझ में आ सकता है कि इसकी अनिवार्य शैली अपने regexes में लीक हो गया है। अन्य भाषाओं में जो regexes है, भले ही लालची मूल्यांकन प्राथमिकता दी जाती है, regexes की अंतर्निहित शैली घोषणात्मक है (एसक्यूएल के समान)।

मुझे लगता है कि ये क्रियाएं कुछ हद तक गूढ़ हैं, या कम से कम एक निम्न स्तर के प्रोग्रामिंग के लिए एक अनावश्यक कदम हैं। एक (* PRUNE) की आवश्यकता के बजाय, यह दृश्यों के पीछे अधिक अनुकूलन (जैसे कंपाइलर या इंजन) के लिए बेहतर नहीं होगा (रेगेक्स लेखक/प्रोग्रामर और पाठक दोनों के लिए जटिलता को कम करना)?

तो, व्यावहारिक रूप से, रेगेक्स में बैकट्रैकिंग-संबंधित क्रिया को शामिल करने में किस स्थिति में उपयोगी है? क्या ऐसा करने का कोई फायदा है?


* तकनीकी रूप से नहीं एक बैक ट्रैकिंग नियंत्रण क्रिया, कई उदाहरण है कि regexes में मनमाने ढंग से कोड निष्पादित को प्रभावित करता है या उलटे पांव लौटने से प्रभावित है कि एक तरह से यह करना है।


पृष्ठभूमि

the Perl regex tutorial के अनुसार, इन सुविधाओं प्रयोगात्मक हैं (और भविष्य में निकाला जा सकता है)। इसमें कोई आश्चर्य की बात नहीं है कि मैं इंटरनेट पर इन संरचनाओं के बारे में ज्यादा जानकारी नहीं पा रहा हूं (विशेष रूप से जब खोज अप्रासंगिक परिणामों से घिरा हुआ है जिसमें कोड के बाहर skip या prune है)। मैं शर्त लगाऊंगा कि इन क्रियाओं का उपयोग करने के लिए कई लोग रेगेक्स में पर्याप्त उन्नत हैं जो बस उनके बारे में नहीं जानते हैं।

  1. विशेषताएं प्रयोगात्मक

  2. विशेषताएं अस्पष्ट

  3. विशेषताएं उन्नत हैं

हैं:

तो वहाँ वर्तमान में बड़े पैमाने पर इस्तेमाल को रोकने व्यावहारिक बाधाओं के एक नंबर रहे हैं उपर्युक्त 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 है देख सकते हैं की
+1

संभावित डुप्लिकेट [क्या आपने अभी तक अपने regexes में पर्ल 5.10 बैकट्रैकिंग नियंत्रण क्रियाओं का उपयोग किया है?] (Http://stackoverflow.com/questions/253760/have-you-used-the-perl-5-10-backtracking -control-verbs-in-your-regexes-yet) – miken32

+0

मैं यह देखने में असफल रहा कि यह प्रश्न कैसे है ("तो, किस स्थिति में एक रेगेक्स में बैकट्रैकिंग से संबंधित क्रिया शामिल करना उपयोगी है?") अलग है जुड़ा हुआ, और सही ढंग से बंद एक ("क्या आपने अभी तक अपने regexes में पर्ल 5.10 बैकट्रैकिंग नियंत्रण क्रियाओं का उपयोग किया है? और उन्होंने आपको किस समस्या में मदद की [हल]?") – miken32

+0

@ miken32 मैंने अपने प्रश्न को और अधिक विस्तृत स्पष्टीकरण के साथ अपडेट किया यह सवाल का जवाब नहीं देता है। क्या यह अब स्पष्ट है कि मैं जो पूछ रहा हूं वह अलग है? मैं उदाहरण के लिए _just_ नहीं पूछ रहा हूँ। – Laurel

उत्तर

1

एक अच्छा टुकड़ा। <commit> निर्देश, विशेष रूप से, (*PRUNE) से संबंधित किसी भी तरह से लगता है (हालांकि (*COMMIT) भी है), और इसमें एक निर्देशक उदाहरण शामिल है।

मेरी व्यक्तिगत छाप यह है कि ज्यादातर बार वे आपको अपने regexes बेहतर (उदाहरण के लिए अधिक प्रदर्शन, या स्पष्ट) बनाने के लिए टूल प्रदान करते हैं लेकिन आवश्यक नहीं है। उदाहरण के तौर पर, आप शायद (*PRUNE) के बिना रह सकते हैं, लेकिन आप भारी बैकट्रैकिंग से ग्रस्त होंगे और यह आपको प्रभावित करने के तरीके पर निर्भर करता है। (*FAIL), शायद यह गैर-मिलान वाले उप-रेगेक्स के साथ अनुकरण किया जा सकता है, लेकिन यह स्पष्ट है कि यह कम से कम पठनीयता को बढ़ाता है।

+0

क्या जुड़ी सामग्री पर्ल 6 regexes का उपयोग करता है? मैं पर्ल 6 रेगेक्स से बहुत परिचित नहीं हूं, हालांकि ऐसा लगता है कि यह बीएनएफ के समान है। (मैंने मूल रूप से इस क्यू से पूछा है, लेकिन मुझे अभी भी कोई आशीर्वाद नहीं है, उदाहरण के लिए, पर्ल में करता है।) – Laurel

+0

नहीं, लिंक एक पर्ल 5 मॉड्यूल को संदर्भित करता है जो 5.6 तक काम करता है .2 http://matrix.cpantesters.org/?dist=Parse-RecDescent+1.967013 - लिंक का उद्देश्य आपको एक उदाहरण देने के लिए किया गया था, जहां खोज स्थान का काटने का अर्थ हो सकता है। – polettix

0

संक्षेप में: आपको पता चलेगा कि आपको उनका उपयोग करने की आवश्यकता है, और यदि आप सुनिश्चित नहीं हैं, तो नहीं।

जैसा कि अन्य लोगों ने संकेत दिया है, ये व्याकरणिक प्रसंस्करण के लिए उपयुक्त प्रदर्शन आधारित अनुकूलन उपकरण होते हैं। न केवल समयपूर्व अनुकूलन सभी बुराइयों की जड़ है, इन सुविधाओं को हाल ही में प्रयोगात्मक के रूप में चिह्नित किया गया था। इसलिए कोई तर्कसंगत रूप से कम कर सकता है कि अधिकांश उपयोग मामलों के लिए वे आवश्यक नहीं हैं, और जब तक आवश्यक हो तो उधार लेने की समस्या/जटिलता नहीं लेनी चाहिए।

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