SomeeLab.tools

रेगुलर एक्सप्रेशन टेस्टर

अपने ही टेक्स्ट पर रेगुलर एक्सप्रेशन आज़माएँ और हर मिलान को उभरा हुआ देखें, साथ में कैप्चर ग्रुप और बदलाव का नतीजा भी।

चारों फ़्लैग क्या करते हैं

g बंद हो तो सिर्फ़ पहला मिलान मिलता है। गिनती करनी हो या सब जगह बदलना हो, तो इसे चालू रखें।

i छोटे-बड़े अक्षरों का फ़र्क़ नहीं देखता। m से ^ और $ पूरी स्ट्रिंग के बजाय हर पंक्ति पर लगते हैं, जो कई पंक्तियों वाले लॉग से पंक्ति की शुरुआत चुनते समय काम आता है।

s से . नई पंक्ति पर भी लागू होता है। सामान्य तौर पर बिंदु पंक्ति-विराम को छोड़ देता है, इसलिए कई पंक्तियों में फैले हिस्से को एक साथ पकड़ने के लिए यह फ़्लैग चाहिए।

याद रखने लायक टुकड़े

  • \d अंक, \w अक्षर-अंक और अंडरस्कोर, \s ख़ाली जगह। बड़े अक्षर में (\D \W \S) इनका उल्टा अर्थ होता है।
  • + एक या अधिक, * शून्य या अधिक, ? वैकल्पिक, {2,4} दो से चार बार।
  • ^ शुरुआत, $ अंत, \b शब्द की सीमा।
  • (...) कैप्चर ग्रुप है और नतीजे में दिखता है; (?:...) सिर्फ़ समूह बनाता है।
  • (?<name>...) लिखने पर ग्रुप को नंबर के बजाय नाम से पढ़ा जा सकता है।

लालची बनाम संयमी

.* जहाँ तक जा सकता है जाता है, फिर पीछे लौटता है। <b>एक</b><b>दो</b> पर <b>.*</b> लगाएँ तो पूरा हिस्सा एक ही मिलान बनकर निगल लिया जाता है।

? जोड़कर <b>.*?</b> बनाने पर यह पहले ही मौक़े पर रुक जाता है और दो मिलान मिलते हैं। टैग या उद्धरण के भीतर का हिस्सा निकालना हो तो आम तौर पर यही सही रहता है।

यह अलग थ्रेड पर क्यों चलता है

क्वांटिफ़ायर एक-दूसरे के भीतर आ जाएँ तो एक्सप्रेशन बेक़ाबू हो सकता है। (a+)+b को तीस के आसपास a दे दीजिए: इंजन उन्हें बाँटने के हर तरीक़े को आज़माता है, और काम कई गुना बढ़ जाता है। इनपुट छोटा-सा होने पर भी मिनटों लग जाते हैं।

यह टूल एक्सप्रेशन को पेज से अलग थ्रेड पर चलाता है और एक सेकंड बीतने पर उस थ्रेड को पूरा ख़त्म कर देता है। यह सब एक ही कॉल के भीतर होता है, इसलिए बीच में रोकने का कोई रास्ता नहीं बचता। यही वजह है कि बेक़ाबू एक्सप्रेशन डालने पर भी पेज चलता रहता है।

सर्वर पर यही चीज़ एक पूरे अनुरोध को जकड़ लेती है। अगर आपके कोड में उपयोगकर्ता का इनपुट किसी रेगुलर एक्सप्रेशन तक पहुँचता है, तो सबसे पहले नत्थी किए हुए क्वांटिफ़ायर ही देखिए।

हर भाषा का लेखन अलग है

यहाँ JavaScript वाला रूप चलता है। लुकबिहाइंड ((?<=...)) मौजूदा ब्राउज़रों में काम करता है, पर रिकर्शन और एटॉमिक ग्रुप जैसी PCRE की अपनी सुविधाएँ यहाँ नहीं हैं।

Python में नामित ग्रुप (?P<name>...) लिखा जाता है, और Java में स्ट्रिंग के भीतर बैकस्लैश एक बार और लगाना पड़ता है। यहाँ तैयार किया पैटर्न ले जाते समय उस भाषा के हिसाब से लेखन बदल लें।