टेक्स्ट और रोजमर्रा के टूल · टेक्स्ट टूलकिट
क्लेन से JavaScript तक: नियमित अभिव्यक्तियों का एक संक्षिप्त इतिहास
· पेजभूमि
रेगुलर-एक्सप्रेशन जावास्क्रिप्ट कंप्यूटिंग-इतिहास
एड, ग्रेप और पर्ल के माध्यम से 1950 के दशक के ऑटोमेटा सिद्धांत से लेकर प्रत्येक ब्राउज़र में JavaScript फ़्लेवर तक नियमित अभिव्यक्तियों का पता लगाता है, यह बताता है कि सिंटैक्स इस तरह क्यों दिखता है और कौन सी सुविधाएँ कब आईं।
एक अजीब सी भाषा जिसे हर कोई आधा-अधूरा जानता है - क्यों रेगेक्स सिंटैक्स प्राचीन और असंगत लगता है
नियमित अभिव्यक्तियाँ युगों में एकत्रित एक भाषा की तरह महसूस होती हैं क्योंकि वे मूलतः यही हैं। प्रत्यावर्तन, दोहराव और समूहन का एक कॉम्पैक्ट कोर गणितीय संकेतन से एडिटर आदेशों, कमांड-लाइन फ़िल्टर और प्रोग्रामिंग-भाषा सुविधाओं में विकसित हुआ। विराम चिह्न बच गया जबकि प्रत्येक मेजबान ने अपनी स्वयं की सुविधाएं, बाधाएं और शब्दावली जोड़ दीं।
वह इतिहास बताता है कि क्यों एक पैटर्न परिचित लग सकता है फिर भी grep, Perl, Python और JavaScript के बीच अलग-अलग व्यवहार करता है। "रेगेक्स" एक पारिवारिक नाम है, कोई एक सार्वभौमिक व्याकरण नहीं। एक स्व-सिखाया विश्लेषक के लिए, उपयोगी सबक हर बोली को याद करना नहीं है, बल्कि उधार लिए गए पैटर्न पर भरोसा करने से पहले इंजन, झंडे और प्रतिस्थापन नियमों की पहचान करना है।
क्लेन की नियमित घटनाएँ - 1950 के दशक का परिमित ऑटोमेटा का गणित जिसने हमें सितारा दिया
परिमित ऑटोमेटा और "नियमित घटनाओं" पर स्टीफन कोल क्लेन के काम ने 1950 के दशक के दौरान सैद्धांतिक जड़ प्रदान की। उनके नोटेशन में संघ, संयोजन और समापन सहित संचालन का उपयोग करके प्रतीक अनुक्रमों के सेट का वर्णन किया गया है। क्लोजर ऑपरेशन क्लेन स्टार बन गया: `A*` का अर्थ है A से लिया गया शून्य या अधिक दोहराव, न कि केवल "एक या अधिक बार दोहराना।"
परिमित ऑटोमेटा द्वारा मान्यता प्राप्त औपचारिक नियमित भाषाएँ अब रेगेक्स लेबल के तहत बेची जाने वाली कई संरचनाओं की तुलना में संकीर्ण हैं। उदाहरण के लिए, बैकरेफ़रेंस उस शास्त्रीय मॉडल से परे स्थितियों को व्यक्त कर सकते हैं। इसलिए आधुनिक इंजन पैटर्न भाषाओं को लागू करते समय ऐतिहासिक नाम और अधिकांश नोटेशन को संरक्षित करते हैं जिनकी क्षमताएं और निष्पादन रणनीतियां क्लेन की मूल गणितीय वस्तु से परे विस्तारित होती हैं।
थॉम्पसन, एड और ग्रेप - कैसे रेगेक्स ने 1960 के दशक के अंत और 1970 के दशक की शुरुआत में Unix टूल्स में टेक्स्ट संपादन में प्रवेश किया
केन थॉम्पसन ने सिद्धांत को कार्यशील टेक्स्ट टूल से जोड़ा। उनके 1968 कम्युनिकेशंस ऑफ़ ACM पेपर में टेक्स्ट खोजने के लिए नियमित अभिव्यक्तियों को मशीन कोड में संकलित करने का वर्णन किया गया था, और उनके पहले एडिटर कार्य ने Unix वंश के अंदर पैटर्न मिलान को रखने में मदद की थी। `ed` एडिटर ने कमांड में नियमित अभिव्यक्तियों का उपयोग किया जो मिलान पंक्तियों को चयनित और परिवर्तित करता है।
`grep` नाम `ed` कमांड से आया है जिसे आमतौर पर `g/re/p` के रूप में प्रस्तुत किया जाता है: विश्व स्तर पर नियमित अभिव्यक्ति से मेल खाने वाली पंक्तियों का चयन करें और उन्हें प्रिंट करें। आरंभिक ग्रेप आज के GNU विकल्पों का संग्रह नहीं था, और बाद के मूल और विस्तारित POSIX फॉर्म भिन्न हैं। स्थायी परिवर्तन व्यावहारिक था: एक छोटी प्रतीकात्मक भाषा पाठ खोजने के लिए रोजमर्रा का इंटरफ़ेस बन गई।
पर्ल और PCRE - वे एक्सटेंशन जो गैर-लालची क्वांटिफायर, लुकअराउंड और सिंटैक्स जोड़ते हैं, जिन्हें आज अधिकांश टूल कॉपी करते हैं
पर्ल ने सामान्य प्रयोजन प्रोग्रामिंग के लिए एक समृद्ध पैटर्न वाली भाषा को केंद्रीय बनाया। इसके सभी संस्करणों में, प्रोग्रामर को एक अत्यधिक दृश्यमान पारिस्थितिकी तंत्र में कैप्चर ग्रुप, बैकरेफरेंस, दावे, आलसी क्वांटिफायर और पैटर्न संशोधक का सामना करना पड़ा। पर्ल 5 दस्तावेज़ निर्माण को रिकॉर्ड करता है जैसे कि न्यूनतम मिलान के लिए `*?` और सकारात्मक भविष्य के लिए `(?=...)`, साथ ही पुराने Unix रूपों में अनुपस्थित कई विशेषताएं।
यह कहना अधिक सुरक्षित है कि पर्ल ने इस शैली को हर एक्सटेंशन का आविष्कार करने का श्रेय देने की तुलना में इसे लोकप्रिय बनाया। PCRE ने जानबूझकर पर्ल-संगत सिंटैक्स की पेशकश की, जबकि अन्य इंजनों ने चयनित विचारों को अपनाया और अन्य को अस्वीकार कर दिया। साझा विराम चिह्न विभिन्न शब्दार्थ, यूनिकोड व्यवहार या प्रदर्शन को छिपा सकते हैं। परिणामस्वरूप "पर्ल-लाइक" एक व्यापक प्रभाव का वर्णन करता है, न कि इस बात की गारंटी कि पर्ल पैटर्न पोर्टेबल है।
पर्ल ने एक बड़े व्यावहारिक पैटर्न वाली भाषा को लोकप्रिय बनाया; बाद के इंजनों ने चुनिंदा रूप से उधार लिया
JavaScript ने ब्राउज़र और अन्य ECMAScript परिवेशों में चलने वाले प्रोग्रामों के लिए अपने स्वयं के `RegExp` ऑब्जेक्ट और `/pattern/gi` जैसे शाब्दिक सिंटैक्स को मानकीकृत किया। इसके स्वाद में कैप्चरिंग और गैर-कैप्चरिंग समूह, बैकरेफरेंस, लुकहेड, आलसी क्वांटिफायर और चरित्र वर्ग शामिल हैं। बाद के संस्करणों में ES2018 विनिर्देश में नामित कैप्चर समूह और लुकबिहाइंड दावे जोड़े गए।
JavaScript PCRE या भिन्न सीमांकक वाला पायथन नहीं है। सुविधा की उपलब्धता इंजन द्वारा कार्यान्वित ईCAमएस्क्रिप्ट संस्करण पर निर्भर करती है, और झंडे सजावट के बजाय व्यवहार का हिस्सा हैं। MDN की रेगुलर-एक्सप्रेशन गाइड ब्राउज़र सिंटैक्स के लिए प्रासंगिक व्यावहारिक संदर्भ है, लेकिन मान्य JavaScript उदाहरण भी उन फ़्लैग पर निर्भर हो सकते हैं जिन्हें कोई विशेष इंटरफ़ेस प्रदर्शित नहीं करता है।
JavaScript ने ES2018 में नामित समूह और लुकबैक प्राप्त किया, लेकिन इंजन और झंडे अभी भी भिन्न हैं
ब्राउज़र सामान्य टेक्स्ट वर्क के पास JavaScript रेगुलर-एक्सप्रेशन इंजन लगाते हैं। एक पेज एक पैटर्न संकलित कर सकता है, मिलानों की गणना कर सकता है और किसी विशेष रेगेक्स सेवा को पाठ भेजे बिना इसे `String.prototype.replace` पर भेज सकता है। यह उपलब्धता ब्राउज़र-साइड ढूंढने और बदलने वाले इंटरफ़ेस को संभव बनाती है, हालांकि व्यापक गोपनीयता दावों के लिए आसपास के पेज का अभी भी अलग से निरीक्षण किया जाना चाहिए।
ToolAcre का कार्यान्वयन `compilePattern` के अंदर `new RegExp` को कॉल करता है, संकलन विफलताओं को पकड़ता है और फेंकने के बजाय एक त्रुटि देता है। `findReplace` मानक प्रतिस्थापन ऑपरेशन लागू करने से पहले मिलानों की गणना करता है। परिणामस्वरूप, JavaScript प्रतिस्थापन टोकन जैसे कैप्चर संदर्भ होस्ट स्ट्रिंग API का अनुसरण करते हैं; रेगेक्स सिंटैक्स और रिप्लेसमेंट सिंटैक्स संबंधित लेकिन अलग-अलग भाषाएं हैं।
इसमें क्या शामिल नहीं है - मूल बातें और इंजन प्रदर्शन आंतरिक से परे औपचारिक भाषा सिद्धांत
यह संक्षिप्त इतिहास व्यावहारिक इंजन और परिमित ऑटोमेटा, सर्वेक्षण रेगेक्स निष्पादन एल्गोरिदम या गति द्वारा रैंक कार्यान्वयन के बीच समानता साबित नहीं करता है। बैकट्रैकिंग, लीनियर-टाइम तकनीक और पैथोलॉजिकल पैटर्न अलग-अलग उपचार के लायक हैं। ToolAcre गार्ड सिंटैक्स त्रुटियों को पकड़ता है, लेकिन यह एक वैध अभिव्यक्ति का पता नहीं लगाता है जो अत्यधिक बैकट्रैकिंग करता है और मुख्य ब्राउज़र थ्रेड को रोकता है।
न ही समयरेखा प्रत्येक मेटाकैरेक्टर को एक ही आविष्कारक को निर्दिष्ट करती है। सॉफ़्टवेयर सुविधाएँ अक्सर एक साफ़ हैंडऑफ़ के बजाय कागजात, एडिटर, भाषा रिलीज़ और संगत पुन: कार्यान्वयन के माध्यम से आती हैं। स्रोत विशिष्ट मील के पत्थर का समर्थन करते हैं; वे इस सरल कहानी को उचित नहीं ठहराते हैं कि एक उत्पाद ने आधुनिक रेगेक्स थोक बनाया या बाद के स्वादों को समान व्यवहार विरासत में मिला।
टेकअवे - टेक्स्ट टूलकिट का रेगेक्स मोड JavaScript फ्लेवर है, इसलिए ब्राउज़र दस्तावेज़ से पैटर्न लिखित रूप में काम करते हैं
व्यावहारिक विरासत ToolAcre में दिखाई देती है: रेगेक्स चालू करें और खोज टेक्स्ट ब्राउज़र के JavaScript इंजन द्वारा संकलित किया जाता है। रेगेक्स को छोड़ दें और मेटाकैरेक्टर बच जाते हैं, जिससे खोज शाब्दिक हो जाती है। संपूर्ण शब्द अभिव्यक्ति को ASCII-शैली `` सीमाओं के साथ लपेटता है, जबकि केस संवेदनशीलता यह नियंत्रित करती है कि `i` ध्वज हमेशा मौजूद वैश्विक `g` ध्वज के साथ आता है या नहीं।
वह अंतिम विवरण रूपरेखा के व्यापक वादे को सही करता है कि ब्राउज़र-दस्तावेज़ीकरण पैटर्न लिखित रूप में काम करते हैं। ToolAcre मल्टीलाइन, डॉट-ऑल, स्टिकी या यूनिकोड फ़्लैग को उजागर नहीं करता है, इसलिए `m`, `s`, `y`, `u` या `v` की आवश्यकता वाले उदाहरणों को अनुकूलन की आवश्यकता है और कुछ को वहां पुन: प्रस्तुत नहीं किया जा सकता है। समर्थित JavaScript पैटर्न का परीक्षण करने, प्रतिस्थापन गणना पढ़ने और परिष्कृत करने से पहले पूर्ववत करने के लिए टूल का उपयोग करें।