सभी लेख

रेगुलर एक्सप्रेशन: बुनियादी बातें और लालची मिलान का जाल

रेगुलर एक्सप्रेशन (regex) टेक्स्ट पैटर्न को संक्षेप में बताने का एक तरीका है: कोई खास स्ट्रिंग नहीं, बल्कि एक नियम जिसे किसी स्ट्रिंग को पूरा करना होता है। लूप में कैरेक्टर-दर-कैरेक्टर जाने के बजाय, आप एक ही एक्सप्रेशन से जटिल संरचना को जाँच या ढूँढ सकते हैं।

बुनियादी बिल्डिंग ब्लॉक्स

  • कैरेक्टर क्लास\d (अंक), \w (अक्षर/अंक/अंडरस्कोर), \s (स्पेस), या [a-zA-Z] जैसी कस्टम क्लास।
  • क्वांटिफ़ायर* (0 या ज़्यादा), + (1 या ज़्यादा), ? (0 या 1), {2,5} (2 से 5 बार)।
  • कैप्चरिंग ग्रुप — कोष्ठक (...) मैच के नतीजे के उस हिस्से को चिह्नित करते हैं जिसे बाद में अलग से इस्तेमाल किया जा सकता है, जैसे रिप्लेसमेंट में।
  • एंकर^ और $ पैटर्न को लाइन की शुरुआत या अंत से बाँधते हैं।

देवनागरी के लिए \p{L} भी काफ़ी क्यों नहीं है

इस टूल के आधार, JavaScript regex इंजन में, \w हमेशा सिर्फ़ [A-Za-z0-9_] होता है — इसलिए /^\w+$/.test('नमस्ते') false देता है। स्वाभाविक फ़िक्स लगता है /^\p{L}+$/u, जो किसी भी लिपि का अक्षर पहचानता है — लेकिन यह भी 'नमस्ते' पर false देता है! वजह: देवनागरी की मात्राएँ (जैसे ि, ) यूनिकोड में अलग कोडपॉइंट होती हैं, जिनकी कैटेगरी "अक्षर" (L) नहीं बल्कि "मार्क" (M) होती है। सही पैटर्न है /^[\p{L}\p{M}]+$/u, जो अक्षर और उनसे जुड़ी मात्राएँ, दोनों को कवर करता है।

लालची बनाम आलसी मिलान

डिफ़ॉल्ट रूप से, क्वांटिफ़ायर "लालची" होते हैं — वे ज़्यादा से ज़्यादा कैरेक्टर कैप्चर करने की कोशिश करते हैं, और सिर्फ़ तभी पीछे हटते हैं जब यह मैचिंग को रोकता है। उदाहरण के लिए, <.+>, <a>टेक्स्ट</a> पर पहले < से लेकर आख़िरी > तक सब कुछ कैप्चर करेगा। क्वांटिफ़ायर के बाद ? जोड़ना (<.+?>) उसे "आलसी" बना देता है — कम से कम कैप्चर करता है, पहले वैध मैच पर रुक जाता है।

यह किस काम आता है

  • इनपुट डेटा फ़ॉर्मेट (ईमेल, फ़ोन नंबर, पिन कोड) को वैलिडेट करना।
  • सटीक मिलान के बजाय पैटर्न के आधार पर मास फ़ाइंड-एंड-रिप्लेस करना।
  • लॉग या असंरचित टेक्स्ट से संरचित डेटा निकालना।

कैटास्ट्रॉफ़िक बैकट्रैकिंग

(a+)+ जैसे नेस्टेड क्वांटिफ़ायर कुछ ख़ास इनपुट स्ट्रिंग पर regex इंजन को यह मानने से पहले कि कोई मैच नहीं है, कॉम्बिनेशन की एक एक्स्पोनेंशियल संख्या आज़माने पर मजबूर कर सकते हैं — पेज या सर्वर एक देखने में साधारण एक्सप्रेशन पर "अटक" जाता है। यह एक असली वल्नरेबिलिटी क्लास है (ReDoS), इसलिए जटिल नेस्टेड क्वांटिफ़ायर को सिर्फ़ अपेक्षित उदाहरणों पर नहीं, बल्कि लंबी "लगभग-मैच" होने वाली स्ट्रिंग्स पर भी टेस्ट करना चाहिए।

टूल आज़माएँ