ऑनलाइन नियमित अभिव्यक्तियों का परीक्षण कैसे करें
नियमित अभिव्यक्तियाँ प्रोग्रामिंग में सबसे शक्तिशाली उपकरणों में से एक हैं, और सही करने के लिए सबसे निराशाजनक में से एक हैं। एक regex परीक्षक आपको कोड चलाने, आउटपुट जाँचने और अनुमान लगाने के बजाय इंटरैक्टिव रूप से पैटर्न बनाने और डीबग करने देता है। फ़ीडबैक लूप प्रति पुनरावृत्ति मिनटों से सेकंड तक गिर जाता है।
regex परीक्षक का उपयोग क्यों करें
अपने कोड संपादक में regex लिखने का मतलब है कि आप केवल रनटाइम पर त्रुटियाँ देखते हैं। एक परीक्षक आपको दिखाता है:
- लाइव मैच हाइलाइटिंग: देखें कि जैसे आप पैटर्न टाइप करते हैं आपके पाठ के कौन से हिस्से मिलते हैं
- कैप्चर समूह: डीबग आउटपुट लिखे बिना देखें कि प्रत्येक समूह क्या कैप्चर करता है
- मैच विवरण: प्रत्येक मिलान की सटीक स्थिति, लंबाई और सामग्री
- प्रतिस्थापन पूर्वावलोकन: इसके लिए प्रतिबद्ध होने से पहले खोजें-और-बदलें का परिणाम देखें
ऑनलाइन regex कैसे परीक्षण करें
- अपना पैटर्न दर्ज करें: पैटर्न फ़ील्ड में regex टाइप करें। आवश्यकतानुसार झंडे (g वैश्विक के लिए, i केस-असंवेदनशील के लिए, m मल्टीलाइन के लिए) टॉगल करें।
- अपना परीक्षण पाठ चिपकाएँ: वह पाठ दर्ज करें जिसके विरुद्ध आप मिलान करना चाहते हैं। मिलान वास्तविक समय में हाइलाइट होते हैं।
- परिणाम देखें: नीचे सूचीबद्ध कैप्चर समूहों के साथ सभी मिलान देखें। प्रतिस्थापन का परीक्षण करने के लिए «से बदलें» फ़ील्ड का उपयोग करें।
नियमित अभिव्यक्तियों का संक्षिप्त इतिहास
नियमित अभिव्यक्तियों को 1951 में गणितज्ञ Stephen Kleene द्वारा तंत्रिका नेटवर्क पर उनके काम में «नियमित घटनाओं» के लिए एक संकेतन के रूप में औपचारिक रूप दिया गया था। वे सिद्धांत से व्यावहारिक उपयोग तक तब कूद गए जब Ken Thompson ने 1968 में बेल लैब्स में QED पाठ संपादक में उन्हें लागू किया, फिर ed संपादक (1969), और अंत में grep उपयोगिता (1973) में, जिसका नाम «global / regular expression / print» से आया है।
1987 में Larry Wall द्वारा पेश किए गए Perl ने regex सिंटैक्स को महत्वपूर्ण रूप से विस्तारित किया: गैर-लोभी क्वांटिफ़ायर, लुकहेड, नामित समूह, \d और \w जैसे वर्ण वर्ग शॉर्टकट। Perl-संगत नियमित अभिव्यक्तियाँ (PCRE) पुस्तकालय, 1997 में जारी, अधिकांश आधुनिक भाषाओं के लिए वास्तविक मानक बन गया।
आज, वस्तुतः हर प्रोग्रामिंग भाषा में अंतर्निहित regex समर्थन है, हालाँकि सिंटैक्स थोड़ा अलग है। JavaScript इंजन (Chrome में V8, Firefox में SpiderMonkey) अत्यधिक अनुकूलित है और अधिकांश ऑनलाइन regex परीक्षकों को शक्ति प्रदान करता है। PHP, Python (re मॉड्यूल), और Java (java.util.regex) निकट से संबंधित लेकिन समान नहीं सिंटैक्स का उपयोग करते हैं। यह जानना कि आप किस फ्लेवर के लिए लिख रहे हैं उन्नत सुविधाओं के लिए मायने रखता है।
जानने योग्य सामान्य regex पैटर्न
ईमेल पता (बुनियादी):
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
URL:
https?://[^\s]+
फ़ोन नंबर (US):
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
दिनांक (YYYY-MM-DD):
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])
IP पता (IPv4):
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
हेक्स रंग कोड:
#(?:[0-9a-fA-F]{3}){1,2}\b
स्लग (URL-सुरक्षित पहचानकर्ता):
^[a-z0-9]+(?:-[a-z0-9]+)*$
व्हाइटस्पेस-ट्रिम्ड स्ट्रिंग:
^\s*(.*?)\s*$
भाषाओं के बीच फ्लेवर अंतर
regex सिंटैक्स ज़्यादातर पोर्टेबल है लेकिन इसमें परेशानियाँ हैं:
- JavaScript: ES2018 (
(?<=...),(?<!...)) में लुकबिहाइंड्स जोड़े गए, Chrome 62+, Firefox 78+, Safari 16.4+ में समर्थित।(?<name>...)के माध्यम से नामित समूह। - Python:
reमॉड्यूल लगभग सभी Perl सुविधाओं का समर्थन करता है; तृतीय-पक्षregexपैकेज और भी जोड़ता है (परिवर्तनीय-लंबाई लुकबिहाइंड, फ़ज़ी मिलान)। - Java: शब्द सीमा के लिए
\bउसी तरह काम करता है; नामित समूह(?<name>...)का उपयोग करते हैं। Pattern.compile + matcher पैटर्न। - PHP:
preg_matchपरिवार हुड के नीचे PCRE का उपयोग करता है। पैटर्न को सीमांकक की आवश्यकता होती है:/pattern/flags। - Go: गारंटीकृत रैखिक प्रदर्शन के लिए RE2 सिंटैक्स (कोई पीछे संदर्भ नहीं, कोई लुकअराउंड नहीं) का उपयोग करता है। कुछ पैटर्न जो JS/PCRE में काम करते हैं Go में विफल होते हैं।
- Rust:
regexक्रेट डिफ़ॉल्ट रूप से RE2 का उपयोग करता है;fancy-regexक्रेट लुकअराउंड जोड़ता है।
जब आप किसी परीक्षक में regex लिखते हैं (लगभग हमेशा JavaScript फ्लेवर), तो इसके लिए प्रतिबद्ध होने से पहले पुष्टि करें कि लक्ष्य भाषा आपके द्वारा उपयोग की गई सभी सुविधाओं का समर्थन करती है।
सामान्य कठिनाइयां
- विपत्तिजनक बैकट्रैकिंग:
aaaaaaaaaaaaaaaaaaaaaaaacके विरुद्ध(a+)+bजैसे पैटर्न घातीय समय ले सकते हैं। regex इंजन हर संभव समूहीकरण की कोशिश करता है। इसे रोकने के लिए स्वामी क्वांटिफ़ायर ((a++)+) या परमाणु समूह(?>a+)+का उपयोग करें। RE2 और Go regex डिज़ाइन द्वारा प्रतिरक्षित हैं। - लोभी बनाम आलसी क्वांटिफ़ायर:
a.*bजितना संभव हो उतना मिलान करता है (लोभी);a.*?bजितना संभव हो उतना कम मिलान करता है (आलसी)। एक को दूसरे के साथ भ्रमित करना «मेरा regex बहुत अधिक मिलान करता है» का #1 स्रोत है। - मल्टीलाइन मोड में एंकर:
^और$डिफ़ॉल्ट रूप से स्ट्रिंग के प्रारंभ/अंत से मेल खाते हैं।mध्वज के साथ, वे प्रत्येक पंक्ति के प्रारंभ/अंत से मेल खाते हैं। इसे भूलने से अधूरे परिणाम मिलते हैं। - वर्ण वर्गों में विशेष वर्ण:
[...]के अंदर, अधिकांश विशेष वर्ण अपना अर्थ खो देते हैं।[.]एक शाब्दिक बिंदु से मेल खाता है। लेकिन],\, और^(शुरुआत में) को अभी भी एस्केप करने की आवश्यकता है। - यूनिकोड और
\w:\wअधिकांश फ्लेवर में[A-Za-z0-9_]है, इसलिए यहéजैसे उच्चारण वाले अक्षरों या गैर-लैटिन लिपियों से मेल नहीं खाता है।\p{L}(यूनिकोड संपत्ति एस्केप) का उपयोग करें या JS मेंuध्वज पास करें। - वैश्विक ध्वज भूलना:
gके बिना,String.matchAll()जैसी विधियाँ फेंकती हैं, और.replace()केवल पहले मैच को बदलता है। परीक्षक डिफ़ॉल्ट रूप से वैश्विक होता है, लेकिन आपका वास्तविक कोड नहीं हो सकता है। - पूर्ण-इनपुट सत्यापन को एंकर करना:
^foo$सुनिश्चित करता है कि पूरा इनपुट «foo» है। एंकर के बिना,fooस्ट्रिंग में कहीं भी मेल खाता है, जो इनपुट सत्यापन में एक सुरक्षा जोखिम है।
regex का उपयोग कब न करें
regex कुछ कार्यों के लिए गलत उपकरण है:
- HTML या XML पार्स करना: नेस्टेड संरचनाएँ, गुण और मनमाने रिक्त स्थान regex को अव्यावहारिक बनाते हैं। उचित पार्सर (DOMParser, BeautifulSoup, lxml) का उपयोग करें।
- JSON पार्स करना: वही कारण।
JSON.parse()या समकक्ष का उपयोग करें। - स्रोत कोड पार्स करना: AST पार्सर (Acorn, Esprima, AST-grep) सिंटैक्स को समझते हैं। regex केवल पाठ देखता है।
- ईमेल सत्यापन: RFC 5322 वैध ईमेल regex 6,000 से अधिक वर्णों का है। वास्तविक सत्यापन के लिए, इसके बजाय एक पुष्टि ईमेल भेजें।
- पासवर्ड शक्ति नियम: «बड़े अक्षर, छोटे अक्षर, अंक, विशेष वर्ण होना चाहिए» के लिए जटिल regex पैटर्न को बनाए रखना मुश्किल है। इसके बजाय कई सरल जांच लिखें।
यदि आप कई नेस्टेड समूहों के साथ 100 से अधिक वर्णों का regex लिख रहे हैं, तो आप शायद गलत समस्या हल कर रहे हैं।
बेहतर regex लिखने के लिए सुझाव
- सरल शुरू करें: पहले एक बुनियादी पैटर्न को काम करने दें, फिर जटिलता जोड़ें। एक झटके में आदर्श regex लिखने की कोशिश शायद ही कभी काम करती है।
- वैश्विक ध्वज (g) का उपयोग करें: इसके बिना, परीक्षक पहले मैच पर रुक जाता है।
gके साथ, आप पाठ में सभी मिलान देखते हैं। - एज केस का परीक्षण करें: आपका regex स्पष्ट मामलों से मेल खा सकता है लेकिन खाली स्ट्रिंग्स, विशेष वर्णों या सीमा शर्तों पर विफल हो सकता है। इन्हें अपने परीक्षण पाठ में जोड़ें।
- विशेष वर्णों को एस्केप करें:
.,*,+,?,(,),[,],{,},\,^,$, और|जैसे वर्णों का regex में विशेष अर्थ है। उन्हें शाब्दिक रूप से मिलान करने के लिए, बैकस्लैश के साथ उपसर्ग करें। - गैर-कैप्चरिंग समूहों का उपयोग करें: यदि आपको समूहीकरण के लिए कोष्ठक चाहिए लेकिन कैप्चर की आवश्यकता नहीं है, तो
(...)के बजाय(?:...)का उपयोग करें। यह आपके मिलान परिणामों को साफ रखता है। - जटिल पैटर्न पर टिप्पणी करें: अधिकांश फ्लेवर
xध्वज (विस्तारित मोड) का समर्थन करते हैं, जो पैटर्न के अंदर रिक्त स्थान और# टिप्पणियाँकी अनुमति देता है। 50 से अधिक वर्णों के regex के लिए इसका उपयोग करें। - अपने परीक्षण सहेजें: एक regex जो आज आपके परीक्षण पाठ पर काम करता है, उसे हमेशा समान इनपुट पर काम करना चाहिए। दस्तावेज़ीकरण के रूप में अपने कोडबेस में regex के साथ परीक्षण के मामले सहेजें।
गोपनीयता और गोपनीय परीक्षण डेटा
regex परीक्षक JavaScript के मूल RegExp इंजन का उपयोग करके पूरी तरह से आपके ब्राउज़र में चलता है। आप जो पैटर्न लिखते हैं, जो परीक्षण पाठ चिपकाते हैं, और जो मिलान देखते हैं वे सभी आपके डिवाइस पर रहते हैं। कुछ भी अपलोड, लॉग या किसी सर्वर द्वारा विश्लेषण नहीं किया जाता है।
यह मायने रखता है क्योंकि regex परीक्षण पाठ में अक्सर संवेदनशील जानकारी होती है: उत्पादन लॉग नमूने (वास्तविक उपयोगकर्ता आईडी, आईपी पते, सत्र टोकन के साथ), CRM से खींची गई ईमेल सूचियाँ, असामान्य तरीकों से स्वरूपित ग्राहक डेटा। क्लाउड regex परीक्षक यह सब अपने सर्वर के माध्यम से रूट करते हैं, कभी-कभी «सुधार» उद्देश्यों के लिए सहेजते हैं। ब्राउज़र-आधारित परीक्षक में इनमें से किसी के लिए शून्य एक्सपोज़र है।
अक्सर पूछे जाने वाले प्रश्न
क्या मेरी regex अन्य प्रोग्रामिंग भाषाओं में काम करेगी?
अधिकांश regex सिंटैक्स JavaScript, Python, Java, PHP और अन्य के बीच साझा है। बुनियादी पैटर्न (वर्ण वर्ग, क्वांटिफ़ायर, एंकर) हर जगह काम करते हैं। lookbehinds या नामित समूहों जैसी कुछ उन्नत सुविधाएँ भाषाओं के अनुसार भिन्न होती हैं।
क्या मेरा परीक्षण डेटा किसी सर्वर पर भेजा जाता है?
नहीं। सारा मिलान JavaScript के मूल RegExp इंजन के साथ आपके ब्राउज़र में स्थानीय रूप से होता है। कुछ भी कहीं और नहीं भेजा जाता।
क्या मैं प्रतिस्थापन का परीक्षण कर सकता हूँ?
हाँ। वास्तविक समय में एक खोज-और-प्रतिस्थापन का परिणाम देखने के लिए एक प्रतिस्थापन पैटर्न दर्ज करें (कैप्चर समूहों के लिए $1, $2 आदि का उपयोग करके)।
क्या यह ऑफ़लाइन काम करता है?
हाँ। एक बार पेज लोड होने के बाद, टूल बिना इंटरनेट कनेक्शन के पूरी तरह आपके ब्राउज़र में काम करता है।