जब एक regexp एक नियमित अभिव्यक्ति नहीं है?


9

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

चूँकि मैंने कभी किसी नियमित अभिव्यक्ति का उपयोग नहीं किया है, अब, मेरा प्रश्न:

मैं तुरंत एक "सही" नियमित अभिव्यक्ति से एक regexp को कैसे देख सकता हूं?

परिभाषाएँ: नियमित अभिव्यक्ति द्वारा, मैं औपचारिक भाषाओं में परिभाषित धारणा को संदर्भित करता हूं। Regexp द्वारा, मेरा मतलब आधुनिक प्रोग्रामिंग भाषाओं द्वारा समर्थित धारणा है; regexp सिंटैक्स में अक्सर अतिरिक्त विशेषताएं होती हैं, जैसे बैकरेफरेंस। प्रोग्रामिंग भाषाओं में देखा गया Regexps औपचारिक भाषा शैली की नियमित अभिव्यक्तियों की तुलना में अधिक शक्तिशाली है।


5
Regexp नियमित अभिव्यक्ति का एक संक्षिप्त नाम है। अभाज्य संख्याओं की गणना एक पर्ल हैक पर आधारित है, न कि नियमित अभिव्यक्तियों पर।

1
बल्कि सरल है। नियमित भाषा समवर्ती, पुनरावृत्ति और प्रत्यावर्तन को रोजगार देती है। कभी भी कोई इंजन इनके समतुल्य नहीं होने का समर्थन करता है, यह गैर नियमित है।
किलन फ़ॉथ

1
संबंधित प्रश्न: 1 , 2 , 3
राफेल

@ यानि यदि आप सीएस के लिए बाड़ पर कूदते हैं, तो यह अब सच नहीं है। प्रोग्रामिंग भाषाओं में देखा गया Regexps नियमित रूप से (औपचारिक भाषा शैली) नियमित अभिव्यक्तियों की तुलना में अधिक शक्तिशाली है, और संक्षिप्त रूप "regexp" सम्मेलन द्वारा है (मुझे नहीं पता कि यह कितना व्यापक है) पूर्व के लिए उपयोग किया जाता है, बाद वाला नहीं। मेहरबान।
राफेल

@KilianFoth वास्तव में एक उपयोगी विवरण नहीं है, हालांकि। उदाहरण के लिए, आप अपनी शक्ति को बढ़ाए बिना नियमित अभिव्यक्तियों के लिए (या, वास्तव में, बूलियन संयोजकों के किसी भी परिमित सेट) को जोड़ सकते हैं।
डेविड रिचेर्बी

जवाबों:


13

tl; डॉ। बैकरेफ़्स।

जैसे ही \1regexp में एक (या कोई भी संख्या जो यूनिकोड से बचने के लिए उपयोग नहीं की जाती है) यह एक नियमित अभिव्यक्ति नहीं है।

Backrefs आपको मेल करने की अनुमति देता है (a+)b\1जो n n से मेल खाता है जिसके aबाद b aकिसी भी n> 1 के लिए n बार होता है । यह एक नियमित भाषा नहीं है (यह एक गैर नियमित भाषा का पोस्टर बच्चा है)।

यह आवश्यक और लगभग पर्याप्त है कि बैकएफ़आर एक समूह का संदर्भ देता है जिसमें एक रेगीक्स होता है जो एक मनमाने ढंग से लंबे स्ट्रिंग से मेल खाता है या जिसमें यह शामिल है *या +। एकमात्र अपवाद (जो मुझे मिला) उस फॉर्म के रीजैक्सप में (A)B\1जहां ए एक परिमित भाषा है (उन्हें स्वीकार करने वाले सभी शब्दों की गणना द्वारा प्रतिस्थापित किया जा सकता है)। आप इसे word1+Bword1|word2+Bword2आदि में बदल सकते हैं क्योंकि A परिमित है।

लुक-अराउंड समूह regexp की नियमितता को दूर नहीं करते। A(?=B)Cregexes के पार अनुभाग है AB.*और ACऔर 2 नियमित भाषाओं के पार अनुभाग नियमित है। निगेटिव लुकहेड B.*(पूरक नियमित भाषाओं के पूरक) का उपयोग करने के अलावा समान है । Lookbehind बिल्कुल वैसा ही है जैसा A(?<=B)Cकि क्रॉस-सेक्शन ACऔर का है .*BC


क्या यह आवश्यक और पर्याप्त है? यह मेरी तरह दिखता है (a)\1, जबकि एक बैकएफ़आर का उपयोग करते हुए, इसके बराबर है aaऔर इसलिए तुच्छ नियमित रूप से। मैं यह भी सोच रहा हूं कि क्या गैर-नियमित भाषाओं को पहचानने के लिए लुकहेड दावे का उपयोग किया जा सकता है।
एमएसल्टर्स

1
@MSalters: यदि आप वास्तव में तकनीकी प्राप्त करना चाहते हैं, (a)\1तो एक नियमित अभिव्यक्ति नहीं है, लेकिन एक नियमित भाषा को पहचानता है।
जोर्ग डब्ल्यू मित्तग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.