रेगेक्स इंजन को लागू करने के पीछे व्यावहारिक मुद्दों पर आधिकारिक संदर्भ, रस कॉक्स द्वारा तीन ब्लॉग पोस्ट की एक श्रृंखला है । जैसा कि वहां वर्णित है, चूंकि बैकरेफ्रेंस आपकी भाषा को गैर-नियमित बनाते हैं, इसलिए उन्हें बैकट्रैकिंग का उपयोग करके लागू किया जाता है ।
रेगाक्स पैटर्न के कई फीचर्स जैसे लुकहेड्स और लुकबाइंड्स, मैचिंग इंजन के कई फीचर्स की तरह, यह तय करने के प्रतिमान में एकदम फिट नहीं बैठते हैं कि स्ट्रिंग एक भाषा का सदस्य है या नहीं। Regexes के बजाय हम आमतौर पर एक बड़े स्ट्रिंग के भीतर सबस्ट्रिंग की खोज कर रहे हैं। "माचिस" वे सबस्ट्रिंग हैं जो भाषा के सदस्य हैं, और वापसी मूल्य बड़े स्ट्रिंग के भीतर प्रतिस्थापन के शुरुआती और अंत बिंदु हैं।
लुकहैड्स और लुकबाइंड्स का बिंदु गैर-नियमित भाषाओं से मेल खाने की क्षमता का परिचय देने के लिए इतना नहीं है, बल्कि समायोजित करने के लिए जहां इंजन मिलान किए गए प्रतिस्थापन की शुरुआत और अंत बिंदुओं की रिपोर्ट करता है।
मैं http://www . अनियमित-expressions.info/lookaround.html पर विवरण पर भरोसा कर रहा हूं । रेगेक्स इंजन जो इस सुविधा का समर्थन करते हैं (पर्ल, टीसीएल, पायथन, रूबी, ...) सभी बैकट्रैकिंग पर आधारित प्रतीत होते हैं (यानी, वे केवल नियमित भाषाओं की तुलना में भाषाओं के बहुत बड़े सेट का समर्थन करते हैं)। वे इस विशेषता को कार्य करने के लिए वास्तविक परिमित ऑटोमेटा के निर्माण की कोशिश करने के बजाय, बैकट्रैकिंग के एक अपेक्षाकृत "सरल" विस्तार के रूप में लागू कर रहे हैं।
पॉजिटिव लुकहेड
वाक्य विन्यास को सकारात्मक अग्रदर्शी है (?=
regex)
। इसलिए उदाहरण के लिए केवल तभी q(?=u)
मिलान q
किया जाता है u
, जब उसका अनुसरण किया जाता है , लेकिन मेल नहीं खाता u
। मुझे लगता है कि वे इसे बैकग्राउंडिंग में बदलाव के साथ लागू करते हैं। सकारात्मक लुकहेड से पहले अभिव्यक्ति के लिए एक एफएसएम बनाएं। जब यह मैच याद आता है कि यह कहां समाप्त हुआ और एक नया FSM शुरू किया जो सकारात्मक रूपांतर के अंदर अभिव्यक्ति का प्रतिनिधित्व करता है। यदि वह मैच तब आपके पास "मैच" है, लेकिन पॉजिटिव लुकहेड मैच शुरू होने से ठीक पहले मैच "समाप्त" होता है।
इसका केवल एक ही हिस्सा है जो बिना बैकग्रांउड के कठिन होगा, आपको इनपुट में उस बिंदु को याद रखने की आवश्यकता है, जहाँ लुकहेड शुरू होता है और मैच के बाद आपके इनपुट टेप को वापस इस स्थिति में ले जाता है।
नकारात्मक लुकहेड
वाक्य विन्यास को नकारात्मक अग्रदर्शी है (?!
regex)
। उदाहरण के लिए केवल तभी q(?!u)
मेल खाता है q
जब तक कि उसका पालन न किया जाए u
। यह या तो q
किसी अन्य चरित्र द्वारा पीछा किया जा सकता है , या q
स्ट्रिंग के बहुत अंत में हो सकता है। मुझे लगता है कि यह लुकहेड अभिव्यक्ति के लिए एक एनएफए बनाकर लागू किया गया है, फिर केवल तभी सफल होगा जब एनएफए बाद के स्ट्रिंग से मेल न खाए।
यदि आप इसे बैकट्रैकिंग पर भरोसा किए बिना करना चाहते हैं तो आप लुकहेड अभिव्यक्ति के एनएफए को नकार सकते हैं, तो इसे उसी तरह से व्यवहार करें जैसे आप सकारात्मक लुकहेड का इलाज करते हैं।
सकारात्मक नजरिया
(?<=
)
(?=q)u
u
q
q
nnn
आप देख रेख ऑपरेटर से पहले आता है कि रेगेक्स के कुछ हिस्से के साथ "स्ट्रिंग जो regex के साथ समाप्त होता है" का चौराहा लेने के बिना इसे लागू करने में सक्षम हो सकता है । यह मुश्किल है, हालांकि हो सकता है क्योंकि lookbehind जा रहा है regex इनपुट की वर्तमान शुरुआत से आगे वापस देखने की जरूरत हो सकती है।
नकारात्मक लग रहा है
वाक्य विन्यास को नकारात्मक lookbehind है (?<!
regex)
। इसलिए, उदाहरण के लिए, (?<!q)u
मेल खाता है u
, लेकिन केवल अगर यह पहले से नहीं है q
। तो यह मेल खाएंगे u
में umbrella
और u
में doubt
, लेकिन नहीं u
में quick
। फिर से, यह regex की लंबाई की गणना करके किया गया लगता है , जो कि कई पात्रों का समर्थन करता है, regex के साथ मैच के लिए परीक्षण कर रहा है , लेकिन अब पूरा मैच विफल हो जाता है यदि लुकअप मैच होता है।
आप का निषेध लेने से उलटे पांव लौटने के बिना इस लागू करने के लिए सक्षम हो सकता है regex और फिर उसी कर के रूप में आप सकारात्मक lookbehind के लिए करना होगा।