रेगेक्स लुकहेड, लुकहाइंड और परमाणु समूह


314

मैंने अपने रेगेक्स बॉडी में इन चीजों को पाया लेकिन मुझे इस बात का कोई सुराग नहीं मिला कि मैं इनका क्या उपयोग कर सकता हूं। क्या किसी के पास उदाहरण हैं इसलिए मैं यह समझने की कोशिश कर सकता हूं कि वे कैसे काम करते हैं?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group

18
रेगेक्स वेबसाइट में इस तरह से कुछ सरल तालिका क्यों नहीं है? इसके बजाय उनके पास केवल समझाने वाले पाठ के ब्लॉक हैं। regular-expressions.info/lookaround.html
व्हिटेकैट

3
@Hitecat कोशिश: regex101.com regexr.com
एंड्रयू

जवाबों:


851

उदाहरण

स्ट्रिंग को देखते हुए foobarbarfoo:

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

आप उन्हें भी जोड़ सकते हैं:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

परिभाषाएं

आगे देखें सकारात्मक (?=)

अभिव्यक्ति का पता लगाएं, जहां अभिव्यक्ति B इस प्रकार है:

A(?=B)

नकारात्मक को आगे देखें (?!)

अभिव्यक्ति खोजें जहाँ अभिव्यक्ति B का पालन नहीं होता है:

A(?!B)

सकारात्मक के पीछे देखो (?<=)

अभिव्यक्ति का पता लगाएं, जहां अभिव्यक्ति B पूर्व:

(?<=B)A

नकारात्मक के पीछे देखो (?<!)

अभिव्यक्ति का पता लगाएं जहां अभिव्यक्ति B पूर्ववर्ती नहीं है:

(?<!B)A

परमाणु समूह (?>)

एक परमाणु समूह एक समूह से बाहर निकलता है और समूह के अंदर पहले मिलान किए गए पैटर्न के बाद वैकल्पिक पैटर्न को हटा देता है (बैकट्रैकिंग अक्षम है)।

  • (?>foo|foot)sfootsइसके पहले विकल्प से मिलान करने के लिए आवेदन किया जाता है foo, फिर असफल हो जाता sहै क्योंकि तुरंत पालन नहीं होता है, और रुकना बंद हो जाता है

एक गैर-परमाणु समूह बैकट्रैकिंग की अनुमति देगा; यदि बाद में मिलान आगे विफल हो जाता है, तो यह तब तक पीछे हट जाएगा और वैकल्पिक पैटर्न का उपयोग करेगा जब तक कि पूरी अभिव्यक्ति के लिए एक मैच नहीं मिलता है या सभी संभावनाएं समाप्त हो जाती हैं।

  • (foo|foot)sके लिए लागू foots:

    1. इसके पहले विकल्प से मेल खाएँ foo, फिर असफल रहें क्योंकि sतुरंत इसका पालन नहीं होता है foots, और इसके दूसरे विकल्प से पीछे हट जाता है;
    2. इसके दूसरे विकल्प से मेल खाते हैं foot, तो sतुरंत इस प्रकार सफल होते हैं footsऔर रुक जाते हैं।

कुछ संसाधन

ऑनलाइन परीक्षक


1
"दूसरी पट्टी पाता है" भाग से आपका क्या मतलब है? अभिव्यक्ति / स्ट्रिंग में केवल एक बार है। धन्यवाद
जिगी

2
@ झीगी का परीक्षण किया जाने वाला स्ट्रिंग "फोब्बरबारफू" है। जैसा कि आप देख सकते हैं कि स्ट्रिंग में दो फू और दो बार हैं।
स्काइफूट

4
क्या कोई समझा सकता है कि किसी को परमाणु समूह की आवश्यकता कब हो सकती है? अगर मुझे केवल पहले विकल्प के साथ मेल खाना है, तो मैं कई विकल्प क्यों देना चाहूंगा?
अरविमन

2
परमाणु समूह के बारे में बेहतर स्पष्टीकरण में इस सवाल का जवाब । क्या कोई व्यक्ति इस उपदेशात्मक उत्तर को पूरा करने के लिए यहां संपादित कर सकता है?
पीटर क्रस

5
बस ध्यान दें कि यह उत्तर आवश्यक था जब मैं एक परियोजना पर समाप्त हो गया था जिसमें गंभीर रेगेक्स चॉप की आवश्यकता थी। यह लुक-अराउंड का एक उत्कृष्ट, संक्षिप्त विवरण है।
टॉम कफ़लिन

215

लुकरॉइड्स शून्य चौड़ाई के दावे हैं। वे एक रेगेक्स के लिए जांच करते हैं (वर्तमान स्थिति के दाएं या बाएं - आगे या पीछे के आधार पर), एक मैच पाए जाने पर सफल होता है या विफल रहता है (यदि यह सकारात्मक या नकारात्मक है) के आधार पर और मिलान किए गए हिस्से को छोड़ देता है। वे किसी भी चरित्र का उपभोग नहीं करते हैं - उनके बाद regex के लिए मिलान (यदि कोई हो), एक ही कर्सर स्थिति पर शुरू होगा।

पढ़ें regular-expression.info अधिक जानकारी के लिए।

  • सकारात्मक रूप:

वाक्य - विन्यास:

(?=REGEX_1)REGEX_2

तभी मैच करें जब REGEX_1 मेल खाता हो; REGEX_1 से मिलान करने के बाद, मैच को छोड़ दिया जाता है और REGEX_2 की खोज उसी स्थिति में शुरू होती है।

उदाहरण:

(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}

REGEX_1 वह है [a-z0-9]{4}$जो लाइन के अंत के बाद चार अल्फ़ान्यूमेरिक वर्णों से मेल खाता है।
REGEX_2 वह है [a-z]{1,2}[0-9]{2,3}जो दो या तीन अंकों के बाद एक या दो अक्षरों से मेल खाता है।

REGEX_1 सुनिश्चित करता है कि स्ट्रिंग की लंबाई वास्तव में 4 है, लेकिन किसी भी वर्ण का उपभोग नहीं करता है ताकि REGEX_2 के लिए खोज उसी स्थान पर शुरू हो। अब REGEX_2 यह सुनिश्चित करता है कि स्ट्रिंग कुछ अन्य नियमों से मेल खाती है। लुक-फॉरवर्ड के बिना यह तीन या पाँच की लंबाई के तारों से मेल खाएगा।

  • नकारात्मक रूप

वाक्य - विन्यास:

(?!REGEX_1)REGEX_2

तभी मैच करें जब REGEX_1 मेल नहीं खाता; REGEX_1 की जाँच करने के बाद, REGEX_2 की खोज उसी स्थिति में शुरू होती है।

उदाहरण:

(?!.*\bFWORD\b)\w{10,30}$

लुक-फॉरवर्ड पार्ट FWORDस्ट्रिंग में जाँच करता है और अगर यह मिल जाता है तो विफल हो जाता है। यदि यह नहीं मिलता है FWORD, तो लुक-फॉरवर्ड सफल होता है और निम्नलिखित भाग यह सत्यापित करता है कि स्ट्रिंग की लंबाई 10 और 30 के बीच है और इसमें केवल शब्द वर्ण हैंa-zA-Z0-9_

लुक-बैक लुक-फॉरवर्ड के समान है: यह सिर्फ वर्तमान कर्सर स्थिति के पीछे दिखता है। जावास्क्रिप्ट की तरह कुछ regex जायके के पीछे के दावे का समर्थन नहीं करता है। और अधिकांश फ्लेवर जो इसका समर्थन करते हैं (PHP, Python etc) को एक निश्चित लंबाई के लिए उस लुक-पीछे वाले हिस्से की आवश्यकता होती है।

  • परमाणु समूह मूल रूप से एक टोकन मिलान के बाद समूह में बाद के टोकन को भूल जाते हैं / भूल जाते हैं। परमाणु समूहों के उदाहरणों के लिए इस पृष्ठ की जाँच करें

आपके स्पष्टीकरण के बाद, जावास्क्रिप्ट, /(?=source)hello/.exec("source...hummhellosource ") = null में काम करना प्रतीत नहीं होता है। क्या आपका स्पष्टीकरण सही है?
हेलिन वांग

@ हेलिनवांग यह स्पष्टीकरण सही है। आपके रेगेक्स को एक स्ट्रिंग की उम्मीद है जो एक ही समय में स्रोत और हैलो दोनों है!
अमरघोष

@jddxf देखभाल विस्तृत करने के लिए?
अमरघोष

@Amarghosh मैं इससे सहमत हूं "वे एक रेगेक्स के लिए जांच करते हैं (वर्तमान स्थिति के दाएं या बाएं - आगे या पीछे आधारित), एक मैच पाए जाने पर सफल होता है या विफल रहता है (यदि यह सकारात्मक या नकारात्मक है तो उसके आधार पर) और मिलान को छोड़ देता है हिस्से।"। तो लुकहेड को वर्तमान स्थिति के दाईं ओर एक रेग्ज की जांच करनी चाहिए और सकारात्मक
लुकहेड

@Amarghosh हैं (?=REGEX_1)REGEX_2केवल मेल खाते हैं, तो REGEX_2आता है के बाद REGEX_1 ?
आनंदी

0

तेजी से ग्रॉकिंग देखना।
लुकहेड और लुकबाइंड को कैसे भेद करें? मेरे साथ 2 मिनट का दौरा करें:

(?=) - positive lookahead
(?<=) - positive lookbehind

मान लीजिए

    A  B  C #in a line

अब, हम बी से पूछते हैं, आप कहां हैं?
बी यह स्थान घोषित करने के लिए दो समाधान हैं:

एक, B के पास A आगे है और C bebind
Two है, B, C के आगे (Lookahead) और पीछे (Lookhehind A) है।

जैसा कि हम देख सकते हैं, पीछे और आगे दो समाधानों में विपरीत हैं।
रेगेक्स दो समाधान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.