← Back to JavaScript Course | Chapter 9: Async & Web APIs | Lesson 22 of 26

JS RegExp एसर्शन्स

Lookahead और lookbehind assertions यह जांचते हैं कि main match से ठीक पहले या बाद कोई pattern मौजूद है (या नहीं), उस आसपास के text को match result में असल में शामिल किए बिना -- जो आपको 'यह शब्द, पर सिर्फ जब उसके बाद वह दूसरा शब्द हो' जैसा कुछ मैच करने देता है, बिना दूसरे शब्द को भी capture किए।
Syntax
javascript
x(?=y)   // lookahead
x(?!y)   // negative lookahead
(?<=y)x  // lookbehind
(?<!y)x  // negative lookbehind

Positive Lookahead: (?=...)

एक positive lookahead, जिसे (?=pattern) लिखा जाता है, मांग करता है कि main match के ठीक बाद दिया गया pattern हो, पर उस बाद वाले text को असली match result का हिस्सा नहीं बनाता -- यह किसी शब्द को सिर्फ तभी मैच करने के लिए उपयोगी है जब उसके ठीक बाद कोई खास शब्द आए।

Note: जब आपको किसी match के ठीक बाद के context की जांच करनी हो बिना उस context को captured result का हिस्सा बनाए, तो lookahead इस्तेमाल करें।
Warning: Beginners अक्सर उम्मीद करते हैं कि lookahead का content match result में दिखेगा -- यह कभी नहीं होता, क्योंकि यह सिर्फ एक condition है, pattern का कोई capturing हिस्सा नहीं।

उदाहरण: Positive Lookahead: (?=...)

javascript
console.log("100px".match(/\d+(?=px)/)); // matches digits only when followed by "px"

Negative Lookahead: (?!...)

एक negative lookahead, (?!pattern), मांग करता है कि main match के बाद दिया गया pattern न हो -- एक positive lookahead का उल्टा, यह किसी खास बाद वाले context को एक वरना valid match से exclude करने के लिए उपयोगी है।

Note: जब किसी match को खासतौर पर उसके ठीक बाद आने वाली चीज़ की वजह से reject होना चाहिए, न कि matched text की वजह से, तो negative lookahead इस्तेमाल करें।
Warning: एक negative lookahead सिर्फ ठीक बाद वाले context को जांचता है -- यह अकेले किसी अतिरिक्त pattern structure के बिना "string में बाद में कहीं भी नहीं आता" express नहीं कर सकता।

उदाहरण: Negative Lookahead: (?!...)

javascript
console.log("100em".match(/\d+(?!px)/)); // matches since NOT followed by "px"

Positive और Negative Lookbehind: (?<=...) और (?<!...)

Lookbehind lookahead जैसा ही काम करता है पर बाद के बजाय match से ठीक पहले के text को जांचता है -- (?<=pattern) मांग करता है कि वह पहले वाला text मौजूद हो, और (?<!pattern) मांग करता है कि वह न हो, फिर भी असली match result में वह पहले वाला text शामिल किए बिना।

Note: जब वह context जो तय करता है कि कोई match valid है या नहीं, आपके असल में capture करना चाहे गए text से पहले आता है, उसके बाद नहीं, तो lookbehind इस्तेमाल करें।
Warning: Lookbehind JavaScript में lookahead के बाद जोड़ा गया था -- हालांकि यह सभी current major browsers में supported है, अगर आपको असामान्य रूप से पुराने browser versions support करने ही हैं तो इसके बारे में जानना ज़रूरी है।

उदाहरण: Positive and Negative Lookbehind: (?<=...) and (?<!...)

javascript
console.log("$100".match(/(?<=\$)\d+/));  // "100", lookbehind for $
console.log("100".match(/(?<!\$)\d+/));   // "100", not preceded by $

Assertions को Main Pattern के साथ Combine करना

Assertions आमतौर पर pattern के एक असली, capturing हिस्से के साथ मिलाए जाते हैं -- assertion context तय करता है, जबकि आसपास का pattern यह define करता है कि असल में क्या मैच और return होता है, साथ मिलकर एक सटीक condition बनाते हुए जो अकेले साधारण character matching से आगे है।

Note: एक assertion को इस सवाल का जवाब देते हुए सोचें "क्या यह सही context है?" जबकि pattern का बाकी हिस्सा जवाब देता है "मैं यहाँ ठीक-ठीक क्या capture करना चाहता हूं?" -- इन दो roles को अलग रखना pattern design को साफ करता है।
Warning: एक pattern में कई chained assertions का ज़्यादा इस्तेमाल इसे पढ़ना और debug करना काफी मुश्किल बना सकता है -- कभी-कभी logic को code में दो अलग checks में बांटना एक घने regex से ज़्यादा साफ होता है।

उदाहरण: Combining Assertions with the Main Pattern

javascript
console.log(/(?=.*\d).{6,}/.test("secret1")); // lookahead checks context, {6,} defines the real match

Assertions कब सही Tool हैं

Assertions खासतौर पर तब चमकते हैं जब आपको आसपास के context के आधार पर मैच करना हो बिना उस context को capture किए -- किसी currency symbol के बाद एक price निकालना, यह validate करना कि किसी password में कई अलग-अलग character types हों, या किसी शब्द को सिर्फ तभी ढूंढना जब वह किसी बड़े compound word का हिस्सा न हो।

Note: किसी assertion का इस्तेमाल खासतौर पर तब करें जब एक normal capturing group आपके match result में अनचाहा अतिरिक्त text शामिल कर दे।
Warning: साधारण मामलों में जहाँ match result में आसपास का context शामिल करना ठीक (या यहाँ तक कि उपयोगी) होगा, एक normal group अक्सर किसी assertion से ज़्यादा सरल होता है।

उदाहरण: When Assertions Are the Right Tool

javascript
console.log("Price: $50".match(/(?<=\$)\d+/)); // extracts price after currency symbol without capturing the symbol itself
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. किसी lookahead/lookbehind को एक normal group से confuse करना -- वे जिस text को check करते हैं वह actual match result में शामिल नहीं होता, जो उसे captured होने की उम्मीद करने वाले लोगों को हैरान करता है।
  2. positive assertions (?=...) और (?<=...) (मौजूद होना चाहिए) को negative वाले (?!...) और (?<!...) (मौजूद नहीं होना चाहिए) से मिला देना।
  3. बिना check किए यह मान लेना कि lookbehind support universal है -- इसे JavaScript में lookahead से बाद में जोड़ा गया और इसकी browser support history थोड़ी अलग है।
चैप्टर सारांश
  • (?=...) एक positive lookahead है: match के बाद दिया गया pattern होना चाहिए, बिना उसे result में शामिल किए।
  • (?!...) एक negative lookahead है: match के बाद दिया गया pattern नहीं होना चाहिए।
  • (?<=...) और (?<!...) positive और negative lookbehind हैं, यह check करते हैं कि match के बाद के बजाय पहले क्या है।
ब्राउज़र सपोर्ट

Lookahead को बहुत लंबे समय से हर browser में support मिला है; lookbehind सभी current major browsers में supported है, जो कुछ हाल में जोड़ा गया।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.