2011-01-19 20 views
48

क्या कोई ऐसा उपकरण है जो एक विशेष नियमित अभिव्यक्ति लेता है और नियमित अभिव्यक्तियों के साथ मिलान की एक निश्चित संख्या के लिए आवश्यक संचालन की संख्या के मामले में सबसे खराब स्थिति परिदृश्य लौटाता है?नियमित अभिव्यक्तियों के लिए सबसे खराब केस विश्लेषण

इसलिए उदाहरण के लिए

, एक (f|a)oo.*[ ]baz को देखते हुए, कितने कदम इंजन संभवतः हालांकि जा सकता के माध्यम से 100 अक्षरों मैच के लिए?

मैं भी दिलचस्पी होगी अगर वहाँ एक उपकरण है कि पाठ के नमूने का एक समूह लेने के लिए और प्रत्येक रन के लिए औसत संचालन दिखा सकते हैं।

मुझे पता है इस इंजन का इस्तेमाल किया और कार्यान्वयन पर एक बहुत निर्भर करेगा - लेकिन मैं कैसे आम यह है के रूप में अज्ञानी हूँ। तो अगर यह कई भाषाओं के लिए आम है (मेरा प्रश्न बहुत अस्पष्ट बना रहा है) तो मुझे विशेष रूप से पर्ल और पायथन में दिलचस्पी होगी।

+0

उत्कृष्ट सवाल! जाहिर है यह रेगेक्स पर निर्भर करेगा। यह अच्छी तरह से ज्ञात है कि शुद्ध regexes (यहां तक ​​कि नीचे संदर्भित '(x + x +) + y' उदाहरण की तरह) एक शुद्ध परिमित-राज्य मशीन ऑटोमाटा स्वीकार करते हैं, लेकिन आम रेगेक्स पुस्तकालय वास्तव में बैकट्रैकिंग के साथ उन लोगों को लागू करते हैं, बड़े हिस्से में फैंसी का समर्थन करने के लिए संदर्भ की तरह सामान। आपके जैसे टूल का वर्णन http://en.wikipedia.org/wiki/Regular_expression_Denial_of_Service_-_ReDoS –

उत्तर

22

Regexbuddy's डिबगर कितने कदम इंजन किसी दिए गए नमूने पर मैच या नहीं समाप्त करने के लिए ले जाएगा पता चलता है। catastrophic backtracking और debugging regular expressions पर अधिक जानकारी।

catastrophic backtracking shown in RegexBuddy

पुनश्च: यह मुक्त नहीं है लेकिन वे एक 3 महीने की पैसा वापस गारंटी प्रदान करते हैं।

+1

को पकड़ने में बहुत अच्छा होगा, मैं इसके साथ खेल रहा था - जेफ इसके प्रशंसक रहे हैं: http://www.codinghorror.com /blog/2004/07/my-buddy-regex.html। लेकिन मैं थोड़ी अधिक प्रोग्रामेटिक सोच रहा था और ऑप्टिमाइज़ेशन की ओर तैयार था - अगर यह समझ में आता है। –

11

ध्यान दें कि यह इंजन पर निर्भर करता है। जबकि रेगेक्स सिद्धांत सीधे ऑटोमाटा सिद्धांत पर आधारित है, अधिकांश इंजन उन सिद्धांतों के सख्त अनुवाद नहीं हैं। इस कारण से, उदाहरण के लिए, कुछ इंजन घातीय समय में होते हैं जबकि सख्त एनएफए प्रसंस्करण नहीं होता है।

7

आप क्या आप re.DEBUG साथ re.compile का उपयोग कर की तरह कुछ के लिए देख रहे हो सकती है। एक व्यापक स्पष्टीकरण के लिए Python Hidden Features समुदाय विकी से यह excellent answer देखें।

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