2013-08-14 7 views
5

अगर मैं लिखनाregex - lookaround कार्यक्षमता

(?<=\()\w+(?=\)) 

इस स्ट्रिंग के लिए के बारे में उलझन: (टेस्ट) (Test2) (test3)

मैं मिल जाएगा: टेस्ट Test2 test3

समझ में आता है कि ।

अगर मैं

\w+ (?<=\()\w+(?=\)) 

बारे में इस स्ट्रिंग के लिए: एलटीई (टेस्ट)

यह कुछ भी नहीं देता है .. क्या समस्या यहाँ है?

कृपया अपने रेगेक्स को स्पष्ट रूप से समझाएं क्योंकि इसे पढ़ना मुश्किल हो सकता है।

+0

http://gskinner.com/RegExr/ का उपयोग करें: स्पष्ट स्पष्टीकरण देखने के लिए अपने माउस को अपने रेगेक्स कोड पर घुमाएं। यह भी देखें http://regex101.com/r/zE8qZ8 – hexicle

+0

मैंने पहली बार परीक्षण करने के लिए regexr का उपयोग किया। अभी भी मुझे यह स्पष्ट नहीं करता है कि यह – hamobi

उत्तर

5

लुकराउंड वर्णों का उपभोग नहीं करते हैं!

यहाँ कदम माध्यम से एक कदम यह देखने के लिए है (सबसे अच्छा नहीं हो सकता है, लेकिन यह है कि मैं इसे कैसे वैसे भी व्याख्या है):

प्रथम चरित्र L है, regex इंजन \w+ के साथ तुलना और इससे सहमत हैं कि यह एक है मैच। T के लिए भी होता है, फिर E

अंतरिक्ष में, रेगेक्स इंजन नियमित अभिव्यक्ति में एक जगह देखता है, यह भी ठीक है।

अगला अप खोलने वाला माता पिता है, लेकिन रेगेक्स क्या देखता है? याद रखें कि लुकराउंड वर्णों का उपभोग नहीं करते हैं, ताकि (?<=\() में वास्तव में उपभोग नहीं किया जा रहा है और \(\w+ मैचों से मेल नहीं खाता है!

आप वास्तव में उन पात्रों का उपभोग करने वाले रेगेक्स के बारे में सोच सकते हैं: \w+ \w+, लेकिन दूसरे \w+ पर एक शर्त के साथ, यह माता-पिता के बीच पाया जाना चाहिए। स्थिति संतुष्ट हो सकती है, लेकिन अभिव्यक्ति स्वयं किसी भी कोष्ठक से मेल नहीं खाती है!

यह मेल बनाने के लिए, आप कोष्ठक जोड़ना चाहिए:

\w+ \((?<=\()\w+(?=\))\) 

देखने और अंतरिक्ष मिलान के बाद, regex इंजन ( देखता है, जो प्रदान की अभिव्यक्ति के साथ सहमत हैं, यह आगे बढ़ता है।

इंजन तब T देखता है। सबसे पहले, यह अगले चरित्र, \w+ से मेल खाता है? हाँ, दूसरा, क्या इससे पहले एक उद्घाटन माता पिता है? हाँ।

आगे बढ़ने से पहले, यह सकारात्मक दिखता है। क्या कोई आगे बढ़ने वाला माता पिता अभी आगे है? नहीं, e है, लेकिन \w+ अभी भी संतुष्ट हो सकता है, इसलिए यह e से दूसरे \w के साथ मेल खाता है। यह t तक इस तरह से चला जाता है। क्या t के बाद कोई बंद माता पिता है? हां, इस प्रकार अगली जांच पर आगे बढ़ें।

यह एक बंद करने वाले माता-पिता से मुकाबला करता है, जो अभिव्यक्ति में समापन माता-पिता से मेल खाता है (ध्यान दें कि शाब्दिक समापन माता-पिता को यहां छोड़ दिया जा सकता है, और आप इसके बजाय LTE (Test से मिलान करेंगे)।

लेकिन यह सब के साथ, यह हो उतना ही अच्छा lookarounds गिरा दिया है करने के लिए हो सकता है:

\w+ \(\w+\) 

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

उम्मीद है कि यह मदद करता है, भले ही यह थोड़ा सा हो!

+0

क्यों काम नहीं करता है, इसलिए मूल रूप से .. वास्तव में एक रेगेक्स के केंद्र में एक लुकराउंड कैंट का उपयोग नहीं किया जा सकता है? मेरे पहले उदाहरण में मुझे बिना किसी पैराशेज के सभी "परीक्षण" मिल रहे हैं, लेकिन मुझे एलटीई नहीं मिलेगा। अगर मैं एलटीई चाहता हूं, तो मुझे स्पष्ट रूप से यह बताते हुए कि पैराथेस हैं? मैं इसे पूरी तरह से प्राप्त नहीं करता हूं। – hamobi

+0

@hamobi आप _can_ इसे रेगेक्स के केंद्र में उपयोग करते हैं, लेकिन क्या यह उपयोगी है या नहीं सवाल होगा। आम तौर पर, जितना संभव हो सके उनसे बचने की कोशिश करें और केवल तभी उपयोग करें जब आवश्यक हो। वे आमतौर पर अधिक प्रसंस्करण समय लेते हैं। – Jerry

2

लुकहेड और देखो "zero-width assertions" हैं, वे स्ट्रिंग में वर्णों का उपभोग नहीं करते हैं, लेकिन केवल यह कहते हैं कि कोई मिलान संभव है या नहीं। आपका दूसरा पैटर्न <word1><space><word2> संरचना खोजने का प्रयास करता है, लेकिन यह भी अपेक्षा करता है कि <word2> कोष्ठक से घिरा हुआ है। यह किसी भी चीज़ पर मेल नहीं खाएगा, क्योंकि <word2> से पहले एकमात्र चरित्र स्वीकार करता है <space> है! मैं सीधे पैटर्न में सीधे कोष्ठक लिखता हूं: (\w+) \((\w+)\)। मैंने कोशिश की, और यह मुझे LTE और Test देता है।