2016-11-28 7 views
5

के बाद मिलान किया मैं इस पैटर्न:regex कैप्चर आदेश: गलत विकल्प लालची पैटर्न

(\w+)(sin|in|pak|red)$ 

और प्रतिस्थापन पैटर्न यह है:

$1tak 

समस्या यह है कि इस शब्द:

सेटसिन

को परिवर्तित हो जाएगा:

setestak

बजाय

setetak

किसी कारण से, in हमेशा पूर्वता sin के पैटर्न में ले जाता है ।

मैं उस आदेश का पालन करने के लिए पैटर्न को कैसे लागू कर सकता हूं?

उत्तर

9

एक आलसी परिमाणक का उपयोग करें:

(\w+?)(sin|in|pak|red)$ 
    ^

देखें regex demo

\w+ एक लालची परिमाणक कि शामिल हैं: 1) के रूप में कई वर्ण पकड़ लेता है के रूप में यह कर सकते हैं (और यह मिलान कर सकते हैं ध्यान दें s, i, सभी अक्षरों, अंक और अंडरस्कोर) और फिर बैकट्रैक (बाद में बाएं से दूसरे स्थानांतरित होने के बाद एक char उत्पन्न करना), बाद के पैटर्न के लिए समायोजित करने का प्रयास कर रहा है। चूंकि in पहले पाया जाता है, यह मिलान किया जाता है, और पूरे समूह को मिलान माना जाता है, रेगेक्स $ के साथ स्ट्रिंग के अंत की जांच करने के लिए चला जाता है। एक आलसी क्वांटिफ़ायर में रेगेक्स इंजन 0 शब्द 3512 से मेल खाने के बाद \w+? छोड़ देगा, और अन्य पैटर्न की कोशिश की जाएगी, बाएं से दाएं चलती है। वही स्थानापन्न

या

\B(?:sin|in|pak|red)$ 
tak स्थानापन्न के रूप में साथ

साथ

(\w)(?:sin|in|pak|red)$ 

:

+0

स्पष्टीकरण के लिए धन्यवाद! कुछ मिनटों में उत्तर स्वीकार करेंगे – Cornwell

+1

लालची क्वांटिफायर का कारण * बैकट्रैकिंग * - यानी, बाद के पैटर्न सही स्थानों पर पाए जाते हैं।आलसी क्वांटफायर उप-पैटर्न * विस्तार * (एक रिवर्स बैकट्रैकिंग) का कारण बनते हैं और बाद के उप-पटरियां बाएं स्थानों पर पाए जाते हैं। यह कहना उचित नहीं है कि आलसी या लालची क्वांटिफायर पैटर्न मिलान के क्रम को परिभाषित करते हैं, लेकिन ऐसा लगता है कि ऐसा ही था। –

+1

@ कॉर्नवेल आलसी का मतलब है कि यह 'इन' से मेल खाने के बाद मिलान करना बंद नहीं करेगा, लेकिन जांच जारी रखेगा जिसका अर्थ है कि यह अंततः 'पाप' से मेल खाता है। यह केवल 'इन' से मेल खाएगा यदि यह एक सटीक मैच है, यानी – bixarrio

3

बिल्कुल एक परिमाणक प्रयोग न करें। गैर-शब्द-सीमा \B यह सुनिश्चित करता है कि पहले एक शब्द वर्ण हो (यदि पहले शब्द वर्ण \B को हटाने से पहले अनिवार्य नहीं है)।

इन दो तरीकों से बायीं ओर पहली घटनाएं पहले पाई जाती हैं और लालची क्वांटिफायर द्वारा उपभोग नहीं की जाती हैं।

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