2014-08-29 7 views
6

क्या कोई वैरिएबल लम्बाई लुक-बैक रेगेक्स बनाने के लिए कोई शानदार समाधान है?परिवर्तनीय लंबाई देखें पीछे पीछे

/(?<=eat_(apple|pear|orange)_)today|yesterday/g; 

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

+0

क्या आप केवल 'आज' या 'कल' से मेल खाना चाहते थे जो कि 'eat_apple' या' eat_pear' या 'eat_orange' –

उत्तर

7

एक विशेष मामले के रूप में \K का उपयोग करें।

यह एक चर लंबाई सकारात्मक lookbehind अभिकथन:

/eat_(?:apple|pear|orange)_\Ktoday|yesterday/g 

वैकल्पिक रूप से, आप अलग से अपने lookbehind दावे बाहर सूचीबद्ध कर सकते हैं:

/(?:(?<=eat_apple_)|(?<=eat_pear_)|(?<=eat_orange_))today|yesterday/g 

हालांकि, मेरा प्रस्ताव है कि यह एक दुर्लभ समस्या हो रहा है जो संभावित रूप से उस सुविधा का उपयोग कर सकता है, लेकिन अन्य सामान्य रेगेक्स सुविधाओं के संयोजन का उपयोग करने के लिए पुनर्विचार नहीं किया जा सका।

दूसरे शब्दों में, यदि आप किसी विशिष्ट समस्या पर फंस जाते हैं, तो इसे यहां साझा करने के लिए स्वतंत्र महसूस करें, और मुझे यकीन है कि कोई अलग (शायद बेहतर) दृष्टिकोण के साथ आ सकता है।

+2

नाइट: '\ K' एक परिवर्तनीय-लंबाई दिखने वाला नहीं है। इसका मतलब है "रखें", और इसे '$ & '(मिलान की गई स्ट्रिंग) में शामिल होने से पहले जो कुछ भी शामिल करता है उसे शामिल नहीं करता है। उस ने कहा, '\ K' का उपयोग एक परिवर्तनीय-लंबाई सकारात्मक दिखने के लिए किया जा सकता है, इसलिए +1। –

3

आप की लुक-पीछे बजाय लुक-आगे का उपयोग कर सकते हैं:

/(?:eat_(apple|pear|orange)_)(?=today|yesterday)/g 

और सामान्य रूप में, वहाँ चीजें हैं जो भोलेपन से लुक-पीछे की आवश्यकता प्रतीत वर्णन करने के लिए एक वैकल्पिक तरीका है।

3

कैसे के बारे में:

(?:(?<=eat_apple_)|(?<=eat_pear_)|(?<=eat_orange_))(today|yesterday) 

थोड़ा सा uggly, लेकिन यह काम करता है।

+2

+1 के ठीक बाद आता है, यह निश्चित रूप से एक छोटी सीमित सूची के लिए एक अच्छा कामकाज है। – anubhava

+0

+1 और '(? <= Eat_apple_ | eat_pear_ | eat_orange _) (आज | कल)' (बिना चिपकने वाले सबपर्टर्न के) पर्ल में काम नहीं करेगा? अभी भी निश्चित लंबाई: [उदाहरण देखें] (http://regex101.com/r/sT2bH5/2) –

+1

@ जॉनी 5: नहीं, लंबाई में बराबर नहीं हैं। – Toto

संबंधित मुद्दे