रेगेक्स चीट शीट

JavaScript फ़्लेवर के लिए एक खोजने योग्य रेगुलर एक्सप्रेशन चीट शीट: वर्ण क्लासेस, ब्रैकेट सेट, क्वांटिफ़ायर, ऐंकर, लुकअराउंड, ग्रुप और फ़्लैग, प्रत्येक कोई उदाहरण के साथ।

उदाहरणों के साथ एकतालीस रेगेक्स टोकन। टोकन, विवरण और उदाहरणों में फ़िल्टर करें, फिर जो सिंटैक्स चाहिए वह कॉपी करें। ब्राउज़र और Node.js में उपयोग किए जाने वाले JavaScript (ECMAScript) फ़्लेवर को कवर करता है।

विश्वास के साथ रेगुलर एक्सप्रेशन पढ़ना और लिखना

एक सिंटैक्स तालिका, ट्यूटोरियल नहीं

रेगुलर एक्सप्रेशन डिज़ाइन से सघन होते हैं। ^(?:\d{1,3}\.){3}\d{1,3}$ जैसा पैटर्न पूरे IPv4 वैलिडेटर को तीस अक्षरों में समेट देता है, जो तब अद्भुत होता है जब आपने इसे लिखा हो और दुखद जब आप किसी और का पढ़ रहे हों। कठिनाई का अधिकांश भाग अवधारणात्मक नहीं है - यह है कि शब्दावली विशाल, संक्षिप्त और आधे-से-याद रखने में आसान है।

यह पृष्ठ उस शब्दावली के लिए एक लुकअप तालिका है, जिसे ठीक वैसे ही व्यवस्थित किया गया है जैसे पैटर्न वास्तव में बनाए जाते हैं: कौन सा एकल वर्ण से मेल करता है, अपने स्वयं के वर्ण सेट को कैसे परिभाषित करें, "इसे दोहराएँ" कैसे कहें, मिलान को कहाँ ऐंकर करें, समूह और वैकल्पिक कैसे बनाएँ, और कौन से फ़्लैग इंजन के व्यवहार को बदलते हैं। फ़िल्टर टोकन, विवरण और उदाहरणों को एक साथ खोजता है, इसलिए "lazy", "boundary" या "lookbehind" टाइप करने से आप सीधे उस पंक्ति पर पहुँच जाते हैं जिसे आप आधे से याद कर रहे हैं।

ये टोकन किस फ़्लेवर का पालन करते हैं

रेगुलर एक्सप्रेशन एक भाषा नहीं हैं। Grep, PCRE, Python, Java, Go का RE2 और JavaScript सभी एक सामान्य कोर साझा करते हैं लेकिन किनारों पर असहमत होते हैं। यहाँ सूचीबद्ध हर चीज़ ECMAScript द्वारा परिभाषित JavaScript फ़्लेवर को लक्ष्य करती है, क्योंकि वही ब्राउज़र, Node.js और अधिकांश फ़्रंट-एंड टूलिंग में चलता है।

तीन अंतर उल्लेख करने लायक हैं। सबसे पहले, lookbehind - (?<=...) और (?<!...) - आधुनिक JavaScript इंजन में समर्थित हैं लेकिन Go के RE2 और पुराने Safari संस्करणों में अनुपस्थित हैं, इसलिए इस पर निर्भर पैटर्न हर जगह पोर्टेबल नहीं हैं। दूसरा, JavaScript का कोई x वर्बोज फ़्लैग नहीं है, इसलिए आप Python की तरह कई लाइनों में टिप्पणियों के साथ पैटर्न नहीं फैला सकते; लंबे पैटर्न आमतौर पर स्ट्रिंग टुकड़ों से जोड़े जाते हैं। तीसरा, \d और \w JavaScript में डिफ़ॉल्ट रूप से केवल ASCII हैं, इसलिए \w उच्चारण चिह्न वाले अक्षरों या CJK अक्षरों से मेल नहीं खाता जब तक कि आप u फ़्लैग के साथ \p{L} जैसे यूनिकोड प्रॉपर्टी एस्केप पर न जाएँ।

ऐसे पैटर्न लिखना जो बनाए रखने योग्य रहें

दो आदतें अधिकांश रेगेक्स पीड़ा को रोकती हैं। पहली यह है कि जानबूझकर ऐंकर करें। एक बिना-ऐंकर पैटर्न स्ट्रिंग में कहीं भी मिलान खोजता है, जो स्कैनिंग के लिए वही है जो आप चाहते हैं और मान्यकरण के लिए लगभग कभी नहीं। ^ और $ जोड़ने से "कोई तारीख़ जैसा कुछ है" बन जाता है "एक तारीख़ है", और यह अंतर वैधता बगों के एक चौंकाने वाले हिस्से के पीछे है।

दूसरी यह है कि लालची वाइल्डकार्ड के बजाय आलसीपन और नकारात्मक वर्ण क्लासेस को प्राथमिकता दें। क्लासिक गलती HTML जैसे टेक्स्ट पर <.+> है: क्योंकि + लालची है, यह लाइन के अंतिम > तक सब कुछ निगल जाता है। <.+?> लिखना, या बेहतर, <[^>]+> एक ही टैग से मेल खाता है। नकारात्मक-क्लास वाला रूप भी काफी तेज़ है, क्योंकि इंजन को वापस ट्रैक नहीं करना पड़ता।

अंत में, विनाशकारी बैकट्रैकिंग (catastrophic backtracking) से अवगत रहें। क्वांटिफ़ायर को नेस्ट करना, जैसे (a+)+b, इंजन को इनपुट को विभाजित करने के तरीकों की घातांकी संख्या में खोजने के लिए मजबूर कर सकता है इससे पहले कि वह निष्कर्ष निकाले कि कोई मेल नहीं है, जो एक मान्यकरण कॉल को उपयोगकर्ता इनपुट को छूने पर सेवा-अस्वीकरण (denial-of-service) वेक्टर बना देता है। यदि कोई पैटर्न किसी क्वांटिफ़ाइड ग्रुप को रखता है जिसमें स्वयं एक क्वांटिफ़ायर है, तो उसे फिर से लिखें - आमतौर पर एक ही वर्ण क्लास एक क्वांटिफ़ायर के साथ रैखिक समय में वही काम करती है। और जब कोई पैटर्न एक या दो लाइन से आगे बढ़ जाता है, तो ईमानदार उत्तर अक्सर यही होता है कि एक वास्तविक पार्सर सही उपकरण है और रेगेक्स नहीं।

स्वनिर्मित। सिंटैक्स तालिका JavaScript (ECMAScript) रेगुलर एक्सप्रेशन फ़्लेवर को लक्ष्य करती है और पूरी तरह आपके ब्राउज़र में चलती है।

अक्सर पूछे जाने वाले प्रश्न

ये टोकन किस रेगेक्स फ़्लेवर का वर्णन करते हैं?
JavaScript (ECMAScript) फ़्लेवर, जो ब्राउज़र, Node.js और अधिकांश फ़्रंट-एंड टूलिंग में चलता है। कोर सिंटैक्स PCRE, Python और Java के साथ साझा है, इसलिए इनमें से अधिकांश टोकन सीधे स्थानांतरित होते हैं, लेकिन यदि आप किसी अन्य इंजन को लक्ष्य कर रहे हैं तो lookbehind और यूनिकोड प्रॉपर्टी एस्केप की जाँच करें।
मेरा पैटर्न मेरी अपेक्षा से अधिक से मेल क्यों खाता है?
लगभग हमेशा कोई क्वांटिफ़ायर लालची होने के कारण। * और + दोनों जितना हो सके उतना लेते हैं और केवल तभी वापस अक्षर देते हैं जब पैटर्न का बाकी भाग विफल हो। उन्हें आलसी बनाने के लिए ? जोड़ें, जैसे .+?, या वाइल्डकार्ड को `[^>]+` जैसी नकारात्मक क्लास से बदलें, जो अधिक सटीक और तेज़ दोनों है।
कैप्चरिंग और नॉन-कैप्चरिंग ग्रुप में क्या अंतर है?
(abc) जो मेल खाया उसे संग्रहीत करता है ताकि आप उसे बाद में \1 से संदर्भित कर सकें या परिणाम ऐरे से पढ़ सकें। (?:abc) टोकन को क्वांटिफ़ायर या वैकल्पिकता के लिए समूहबद्ध करता है बिना कुछ भी संग्रहीत किए। जब आपको केवल समूहीकरण की आवश्यकता हो तो नॉन-कैप्चरिंग रूप का उपयोग करें; यह परिणाम इंडेक्स को स्थिर रखता है और थोड़ा ओवरहेड कम करता है।
\w अक्षरांकित या चीनी अक्षरों से मेल क्यों नहीं खाता?
JavaScript में \w को [A-Za-z0-9_] के रूप में परिभाषित किया गया है और यह जानबूझकर केवल ASCII है। किसी भी लिपि के अक्षरों से मेल करने के लिए, u फ़्लैग के साथ यूनिकोड प्रॉपर्टी एस्केप का उपयोग करें: /\p{L}+/u लैटिन, सिरिलिक, ग्रीक, हान, काना और हर अन्य लिपि के अक्षरों से मेल खाता है।
क्या रेगुलर एक्सप्रेशन सुरक्षा जोखिम हो सकता है?
हाँ। (a+)+b जैसे नेस्टेड क्वांटिफ़ायर विनाशकारी बैकट्रैकिंग ट्रिगर कर सकते हैं, जहाँ इंजन विफल होने से पहले संभावनाओं की घातांकी संख्या का पता लगाता है। यदि ऐसा पैटर्न उपयोगकर्ता इनपुट पर लागू किया जाए, तो एक छोटी सुगठित स्ट्रिंग प्रक्रिया को फ्रीज कर सकती है। जहाँ संभव हो नेस्टेड क्वांटिफ़ायर को एक ही वर्ण क्लास में फिर से लिखें।
क्या मुझे HTML या JSON को पार्स करने के लिए रेगेक्स का उपयोग करना चाहिए?
नहीं। दोनों पुनरावर्ती (recursive) फ़ॉर्मैट हैं और रेगुलर एक्सप्रेशन 임의 नेस्टिंग को व्यक्त नहीं कर सकते। एक वास्तविक पार्सर का उपयोग करें: HTML के लिए DOMParser, JSON के लिए JSON.parse। रेगुलर एक्सप्रेशन सपाट टेक्स्ट को स्कैन करने, सरल फ़ील्ड फ़ॉर्मैट को मान्य करने और लक्षित खोज-और-बदल के लिए सही उपकरण हैं।